javaEE 第七篇博客----JSON
一、JSON基本介绍:
1、JSON是一种基于文本的数据交换格式,它来自于web服务和其他连接应用程序中使用的JavaScript
2、JSON只定义了两个数据结构:对象和数组。对象是一组名称-值对,数组是值的列表。JSON定义了7种值类型:string、number、object、array、true、false和null。
3、JSON通常被用作一种常见的格式,用于序列化和反序列化在Internet上通信的应用程序中的数据。这些应用程序是使用不同的编程语言创建的,并且在非常不同的环境中运行。JSON适合这个场景,因为它是一个开放的标准,它很容易读和写,而且它比其他表示更紧凑。
4、JSON表示通常比XML表示更紧凑,因为JSON没有结束标记。与XML不同,JSON并没有一个广泛接受的模式来定义和验证JSON数据的结构。
5、对象模型创建了一个在内存中表示JSON数据的树。然后可以对树进行导航、分析或修改。这种方法是最灵活的,允许进行处理,这需要访问树的完整内容。但是,它通常比流模型要慢,需要更多的内存。对象模型通过一次导航整个树来生成JSON输出。
6、流模型使用基于事件的解析器,每次只读取一个元素的JSON数据。当一个对象或数组开始或结束时,当它找到一个键,或者当它找到一个值时,解析器会生成事件并停止处理。应用程序代码可以处理或丢弃每个元素,然后解析器继续进行下一个事件。这种方法适合于本地处理,其中一个元素的处理不需要来自其他数据的信息。流模型通过一次使用一个元素调用一个函数来生成JSON输出到给定的流。
JSON建构于两种结构:
“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
1.对简单数据类型的encoding和decoding:
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
print json.dumps(['foo',{'bar':('baz',None,1.0,2)}])
print json.dumps("\"foo\bar")
print json.dumps(u'\u1234')
print json.dumps('\\')
print json.dumps({"c":0,"b":0,"a":0},sort_keys=True)
输出:
["foo", {"bar": ["baz", null, 1.0, 2]}]
"\"foo\bar"
"\u1234"
"\\"
{"a": 0, "b": 0, "c": 0}
compact encoding:
#json主要是作为一种数据通信的格式存在的,而网络通信是很在乎数据的大小的,无用的空格会占据很多通信带宽,所以适当时候也要对数据进行压缩。separator参数可以起到这样的作用,该参数传递是一个元组,包含分割对象的字符串。
print json.dumps([1,2,3,{'4':5,'6':7}],separators=(',',':'))
#indent参数是缩进的意思,它可以使得数据存储的格式变得更加优雅。
print json.dumps([1,2,3,{'4':5,'6':7}],separators=(',',':'),indent = 4)
2.decoding JSON
json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])www.2cto.com
print json.loads('["foo",{"bar":["baz",null,1.0,2]}]')
print json.loads('"\\"foo\\bar"')
输出:
[u'foo', {u'bar': [u'baz', None, 1.0, 2]}]
"foar
3.特殊JSON对象的解析
def as_complex(dct):
if '__complex__' in dct:
return complex(dct['real'],dct['imag'])
return dct
print json.loads('{"__complex__":true,"real":1,"imag":2}',object_hook=as_complex)
输出:
(1+2j)