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转换实现。
测试结果:
以上用Java实现简单JSONUtils工具包,当然这里并没有处理复杂的Java对象以及嵌套引用的情况,也可以在Introducing JSON上面了解更多的JSON工具包及应用。
在Web开发领域,主要的数据交换格式有XML和JSON,XML对于JSON来说出现较早,也是被好多人熟悉了解。相比之下,JSON可能对于一些新手会感到有些陌生,但从JSON的定义来看,就是简明其意的键值对(key:value)对象,并且可以接受任何数据类型的对象,可以传输一个简单的String、Number、Boolean,甚至可以是一个数组或者一个复杂的Object对象。
下面简单介绍XML和JSON两种数据交换格式的比较,然后简单的用Java实现一些JSONUtil的JSON转换实现。
XML和JSON比较
XML | JSON | |
定义 | 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工具包及应用。
相关文章推荐
- 讲讲Mongodb的24位ObjectId的无损压缩
- 在RedHatEnterpriseServer 6.1下安装mongodb(一)
- MongoDB 查询优化分析
- MongoDB T-shirt 来了
- NoSQL高级培训课程-HBase&&MongoDB(两天版)
- MongoDB安装成为Windows服务及日常使用遇到问题总结
- 30分钟学MongoDB系列——限定集与大文件存储篇
- MongoDB学习笔记(四)--索引 && 性能优化
- [转载]MongoDB设置访问权限、设置用户
- mongodb与关系型数据库相比的优缺点zz
- Mongodb启动命令mongod参数说明
- MongoDB学习笔记之 第1章 MongoDB的安装
- 【MongoDB for Java】Java操作MongoDB
- MongoDB 基本命令
- 30分钟学MongoDB系列——高级查询与操作篇
- Linux下安装并启动MongoDB
- Linux下安装并启动MongoDB
- Linux下安装并启动MongoDB
- mongodb
- mongoDB研究笔记:分片集群部署