您的位置:首页 > 数据库 > Mongodb

MongoDB的学习与应用三:MongoDB中必须要懂的JSON

2014-02-25 21:42 567 查看
在具体学习MongoDB数据处理之前,插播一段关于JSON的广告,主要是因为后面我们会更多的和这种简易的弱类型数据格式打交道。

在Web开发领域,主要的数据交换格式有XML和JSON,XML对于JSON来说出现较早,也是被好多人熟悉了解。相比之下,JSON可能对于一些新手会感到有些陌生,但从JSON的定义来看,就是简明其意的键值对(key:value)对象,并且可以接受任何数据类型的对象,可以传输一个简单的String、Number、Boolean,甚至可以是一个数组或者一个复杂的Object对象。
下面简单介绍XML和JSON两种数据交换格式的比较,然后简单的用Java实现一些JSONUtil的JSON转换实现。

XML和JSON比较

XMLJSON
定义extensible markup language,一种类似于HTML的语言,他没有预先定义的标签,使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准JavaScript Object Notation 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

优势1.格式统一,符合标准;
2.容易进行系统间数据交换、共享;
1.轻量级数据交换格式,用简单的key:value键值对即可标识所有对象关系,不需要过多的标签;
2.支持压缩,占用带宽小;
3.易于解析,客户端用JavaScript可以采用面向对象的方式直接获取JSON对象的属性,能直接被客户端使用,减少了客户端开发;
劣势1.文件格式庞大、复杂,网络传输占用带宽较大;
2.需要大量代码来解析XML格式文件,复用性较差;
3.浏览器间存在差异,IE和其他浏览器对XML解析和操作存在差异;
1.没有XML格式这么推广的深入人心和使用广泛, 没有XML那么通用性,出现较晚,还处于推广阶段;
2.对数据的描述性比XML差;
解析方式XML目前设计了两种解析方式:DOM和 SAX;1.DOM是把一个数据交换格式XML看成一个DOM对象,需要把XML文件整个读入内存,这一点上JSON和XML的原理是一样的,但是XML要 考虑父节点和子节点,这一点上JSON的解析难度要小很多,因为JSON构建于两种结构:key/value,键值对的集合;值的有序集合,可理解为数组;2.SAX不需要整个读入文档就可以对解析出的内容进行处理,是一种逐步解析的方法。程序也可以随时终止解析。这样,一个大的文档就可以逐步的、一点一点的展现出来,所以SAX适合于大规模的解析。这一点,JSON目前是做不到得。JSON只提供整体解析方案,而这种方法只在解析较少的数据时才能起到良好的效果;而XML提 供了对大规模数据的逐步解析方案,这种方案很适合于对大量数据的处理。

用Java实现简单对象和JSON转化

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class JsonUtils {

	/**
	 * String2Json
	 * 
	 * @param str
	 * @return
	 */
	private static String string2Json(String str){
		StringBuilder sb = new StringBuilder();//(str.length()+20);
		sb.append("\"");
		for(int i=0;i<str.length();i++){
			char c = str.charAt(i);
			switch (c) {
			case '\"':
				sb.append("\\\"");
				break;
			case '\\':
				sb.append("\\\\");
				break;
			case '/':
				sb.append("\\/");
				break;
			case '\b':
				sb.append("\\b");
				break;
			case '\f':
				sb.append("\\f");
				break;
			case '\n':
				sb.append("\\n");
				break;
			case '\r':
				sb.append("\\r");
				break;
			case '\t':
				sb.append("\\t");
				break;
			default:
				sb.append(c);
				break;
			}
		}
		
		sb.append("\"");
		return sb.toString();
	}
	
	/**
	 * Number2Json
	 * 
	 * @param number
	 * @return
	 */
	private static String number2Json(Number number){
		return number.toString();
	}
	
	/**
	 * Boolean2Json
	 * 
	 * @param bool
	 * @return
	 */
	private static String boolean2Json(Boolean bool){
		return bool.toString();
	}
	
	/**
	 * Map2Json
	 * 
	 * @param map
	 * @return
	 */
	private static String map2Json(Map<String,Object> map){
		if(map.isEmpty()){
			return "{}";
		}
		StringBuilder sb = new StringBuilder();
		sb.append('{');
		Set<String> keys = map.keySet();
		for(String key:keys){
			Object value = map.get(key);
			sb.append('\"');
			sb.append(key);
			sb.append('\"');
			sb.append(':');
			sb.append(toJson(value));
//			sb.append('}');
			sb.append(',');
		}
		sb.setCharAt(sb.length()-1, '}');
		return sb.toString();
	}
	
	/**
	 * Array2Json
	 * 
	 * @param array
	 * @return
	 */
	private static String array2Json(Object[] array){
		if(array.length==0)
			return "[]";
		StringBuilder sb = new StringBuilder(array.length+20);
		sb.append('[');
		for(Object obj:array){
			sb.append(toJson(obj));
			sb.append(',');
		}
		sb.setCharAt(sb.length()-1, ']');
		return sb.toString();
	}
	
	
	private static String toJson(Object obj){
		if(obj == null)
			return "null";
		if(obj instanceof Number)
			return number2Json((Number) obj);
		if(obj instanceof Boolean)
			return boolean2Json((Boolean) obj);
		if(obj instanceof String)
			return string2Json((String)obj);
		if(obj instanceof Object[])
			return array2Json((Object[]) obj);
		
		return "error:"+obj.toString();
	}

	
	public static void main(String[] args) {
		String str = "abc\t,]";
		System.out.println("test string2Json:"+string2Json(str));
		
		Object[] objArray = new Object[]{"2","3"};
		System.out.println("test arry2Json:"+toJson(objArray));
		
		Map<String,Object> map = new HashMap<String, Object>();
		map.put("a", 1);
		map.put("b", true);
		map.put("c", objArray );
		System.out.println("test map2Json:"+map2Json(map));
		
	}
	
}

测试结果:
test string2Json:"abc\t,]"
test arry2Json:["2","3"]
test map2Json:{"b":true,"c":["2","3"],"a":1}

以上用Java实现简单JSONUtils工具包,当然这里并没有处理复杂的Java对象以及嵌套引用的情况,也可以在Introducing JSON上面了解更多的JSON工具包及应用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: