Json学习一(基础概念知识学习)
1.Json简单介绍
JSON(JavaScript Object Notation)
是一种轻量级的数据交换格式。它使得人们非常easy的进行阅读和编写。同一时候也方便了机器进行解析和生成。它是基于 JavaScript
Programming Language , Standard ECMA-262 3rd Edition - December 1999
的一个子集。 JSON採用全然独立于程序语言的文本格式。可是也使用了类C语言的习惯(包括C, C++, C#, Java,
JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
JSON基于两种结构:
“名称/值”对的集合(A collection of name/value
pairs)。不同的编程语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary)。哈希表(hash
table),有键列表(keyed list)。或者关联数组 (associative array)。值的有序列表(An ordered list of
values)。在大部分语言中,它被实现为数组(array),矢量(vector),列表(list),序列(sequence)。
这些都是常见的数据结构。眼下,绝大部分编程语言都以某种形式支持它们。这使得在各种编程语言之间交换相同格式的数据成为可能。
JSON具有下面这些形式:
对象(object) 是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)開始,“}”(右括号)结束。每一个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
数组(array) 是值(value)的有序集合。一个数组以“[”(左中括号)開始,“]”(右中括号)结束。
值之间使用“,”(逗号)分隔。
值(value) 能够是双引號括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构能够嵌套。
字符串(string) 是由双引號包围的随意数量Unicode字符的集合,使用反斜线转义。
一个字符(character)即一个单独的字符串(character string)。
JSON的字符串(string)与C或者Java的字符串非常类似。
数值(number) 也与C或者Java的数值非常类似。
仅仅是JSON的数值没有使用八进制与十六进制格式。
同一时候,能够在随意标记之间加入空白。
2.Java中的Json
2.1.json源代码
源代码下载地址:https://github.com/stleary/JSON-java
2.2.JsonLib的使用
Json-lib 下载地址:http://json-lib.sourceforge.net/
所须要的jar包括下面:
commons-beanutils-1.8.3.jar
commons-collections-3.2.1.jar
commons-lang-2.6.jar
commons-logging-1.1.1.jar
ezmorph-1.0.6.jar
json-lib-2.4-jdk15.jar
2.3.Org.json
下载地址:https://search.maven.org/#search|gav|1|g%3A%22org.json%22%20AND%20a%3A%22json%22
3.JavaScript中的json
JSON 是JavaScript对象文字符号的一个子集. 由于JSON是JavaScript的一个子集, 它能够自如的在JavaScript中使用.
var myJSONObject = {
"bindings": [
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"},
{"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"},
{"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"}
]
};
在这个样例中, 创建了仅仅包括一个成员 bindings 的对象, 而这个对象又包括了一个拥有三个对象的数组, 当中每一个数组对象包括了 ircEvent, method, regex 三个成员.
成员能够用 点(.) 或者 下标([]) 操作符来引用.
myJSONObject.bindings[0].method // "newURI"
要将 JSON 字符串转换成一个对象, 我们能够用 eval() 函数. eval() 会触发JavaScript的编译器. 由于JSON是JavaScript的一个真子集, 编译器会正确的解析字符串内容, 同一时候生成一个对象结构. 字符串必须用括号括起来, 以免产生JavaScript语法歧义.
var myObject = eval('(' + myJSONtext + ')');
eval 函数速度非常快. 它能够编译和运行不论什么JavaScript代码, 这里可能存在安全问题. 当源是可信的并且完整的时候, 能够使用 eval. 而用JSON解析器是更安全的方式. 在使用XMLHttpRequest的Web程序中, 仅仅同意在同源的情况下通信, 因此它是可信的. 但它不一定是完整的. 假设server用的不是严谨的JSON编码, 或者它没有严格检查全部输入内容, 它也能够提供无效的JSON, 同一时候带上危急的脚本. 此时, eval 将会运行该脚本, 产生危害.
为了解决问题, 应该使用JSON解析器. JSON解析器仅仅会识别JSON文本, 拒绝全部脚本. 在提供原生JSON支持的浏览器中, JSON解析器比 eval 更快. 原生的JSON支持非常有可能包括在ECMAScript下一个版本号的标准中.
var myObject = JSON.parse(myJSONtext, reviver);
可选的reviver參数是一个函数, 在每一个键/值在每一级的终于结果后都会被调用. 每一个值将会被替换为reviver函数的返回结果. 它能够用来将对象组织成伪类(pseudoclasses)的一个实例, 或者将date字符串转换成Date对象
myData = JSON.parse(text, function (key, value) {
var type;
if (value && typeof value === 'object') {
type = value.type;
if (typeof type === 'string' && typeof window[type] === 'function') {
return new (window[type])(value);
}
}
return value;
});
JSON字符串化是一个反过来的动作, 它将JavaScript的数据结构转化成JSON字符串. JSON不支持循环的数据结构, 因此在用JSON字符串化的时候, 不要给它循环引用的结构.
var myJSONText = JSON.stringify(myObject, replacer);
假设 stringify 方法发现对象包括了一个 toJSON 的方法, 它会调用这种方法, 然后将返回的结果字符串化. 这同意对象自定义它们的JSON表示方式.
字符串化方法能够带一个可选的字符串数组. 这些字符串能够用来选择哪些属性将会被包括在生成的JSON文本中.
字符串化方法还能够使用一个可选的 replacer 函数, 这个函数将会在结构中的每一个值的 toJSON 方法(假设存在的话) 后调用. 它将接收每一个key和value作为它的參数. 这会被绑定在包括key的对象中. 它返回的值会被字符串化.
没有JSON表示的值(比方函数和undefined)将会被排除.
无限大的数字将会被替换为NULL, 要替换其它值, 你能够用类似的 replacer 函数:
function replacer(key, value) {
if (typeof value === 'number' && !isFinite(value)) {
return String(value);
}
return value;
}
提供一个合适的 reviver 函数给 JSON.parse 就能够实现.
4.Json与XML
可扩展标记语言(XML)是一种来自标准通用标记语言(SGML)的文本格式. 与SGML相比, XML更简单. 超文本标记语言(HTML), 经过对照, 显得更为简单. 虽然如此, 一本好的HTML參考书有一英寸厚. 这是由于文档的格式化和结构化是一件复杂的事情.
大部分XML的优势是环绕它作为可交互数据序列格式的角色. 作为数据表示语言, XML有着两个巨大的优势:
- 它是基于文本的.
- 它是位置无关的.
全部这些使得她相比其它数据交换格式在更高层次上独立于应用程序. 其实, XML已经是W3C的标准, 这意味着已经无需再去争论(或者看起来如此).
遗憾的是, XML不能非常好的适用于数据交换, 就好像扳手并非用来钉钉子的. 它包括了太多的包装, 并且它跟大多数编程语言的数据模型不匹配. 大部分程序猿在第一眼见到XML的时候, 他们都被XML的丑陋和低效所震惊了. 事实证明, 第一反应旺旺是正确的. 还有还有一种蚊子符号, 她不但有XML的全部长处, 并且她更适合于数据交换. 这个符号就是JavaScript对象符号(JSON).
关于XML的最明智的见解(比如: xmlsuck.org)指出XML在作为数据交互格式上存在非常大的问题. 但这一不足被它所带来的互操作性和开放性所弥补.
JSON拥有相同的互操作性和开放性, 并且没有其它不足.
让我们在觉得重要的属性上来比較XML和JSON.
1)简单
XML比SGML更简单, 但JSON比XML还要简单. JSON拥有更简单的语法, 并且直接相应到现代语言的数据结构.
2)可扩展性
JSON是不可扩展的, 由于她不须要被扩展. JSON不是一个文档标记语言, 因此没有不论什么必要去定义新的标签或者属性来表示内部数据.
3)互操作性
JSON拥有XML一样的互操作性能.
4)开放性
JSON至少与XML一样开放, 或许更开放. 由于她不在社团/政治标准化斗争的中心.
5)XML是可供人类阅读的
相比XML, JSON更加easy阅读. 她也更easy书写.同一时候, 也更easy被机器读取和写入.
6)XML能够用来作为数据交换格式, 使得用户能够将他们的数据在类似的程序之间相互移动.
相同的, JSON也如此.
7)XML提供了一种数据结构, 以包括很多其它的信息.
相同的, JSON也如此.
8)XML非常easy处理, 由于数据的结构是简单并且标准的.
JSON能够更easy的处理, 由于她的结构更简单.
9)有非常多可重用的软件提供给程序猿来处理XML, 他们不须要重写代码.
JSON, 作为一个更简单的符号, 须要更少的软件. 在JavaScript和Python中, JSON符号是内置与程序语言的. 压根不须要不论什么多余的软件. 在其它语言中, 仅仅须要少量的JSON特定的代码. 比方, JSON.org提供了一个仅仅包括三个类的包就能够使得Java语言支持JSON.
10)XML将数据的表示和数据的结构分开
XML须要将数据结构转换成文档结构. 这个映射是复杂的. JSON结构是基于数组和记录的. 那就是数据的组成. XML结构是基于元素(能够嵌套), 属性(不能嵌套), 原始蚊子, 实体, DTD和其它元数据结构.
11)一种通用的交换格式
JSON是一种更好的数据交换格式. XML是更好的文档交换格式. 用正确的工具做正确事.
12)一个数据多中展示
JSON不提供不论什么显示能力由于她不是文档标记语言.
13)自描写叙述数据
XML和JSON在这一点上是一样的.
14)全然集成全部传统数据库和格式
(关于XML的陈述有时有点夸张) XML文档能够包括不论什么能够想象的数据类型 - 从传统数据, 如文本和数字、多媒体对象, 如声音, 到活动格式, 如Java Applet 或者ActiveX 组件.
JSON没有<[CDATA[]]>特性, 因此她不适合用来承载声音或者图像或者其它大的二进制载荷. JSON为数据进行了优化. 此外, 在数据交换系统中提供可运行程序可能会引入危急的安全问题.
15)国际化
XML和JSON都用Unicode编码.
16)开放性和可扩展性
XML有一个开放的结构同意你在须要的时候加入其它国家的艺术元素. 这意味着你能够随时调整你的系统来接受特定行业的词汇.
这些词汇能够自己主动转换为JSON, 从XML迁移到JSON是非常简单的.
17)XML对于人类和机器阅读起来都非常easy.
JSON比XML更easy让人和机器阅读.
18)XML是面向对象的
其实, XML是面向文档的. JSON是面向数据的. JSON能够更easy的映射到面向对象的系统.
19)XML被计算机行业广泛的使用
JSON刚刚被大家所知. 她的简洁以及从非常easy从XML转换到JSON的特性使得JSON会更加被广泛的使用.