python操作json

json介绍

说明:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。

关于json更为详细的内容,可以参考其官方网站:http://www.json.org
从官方网站上摘取部分,了解一下json的结构:
JSON建构于两种结构:

  • 名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
  • 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

  • python标准库中有json模块,主要是执行序列化和反序列化功能:

序列化:encoding,把一个python对象编码转化成json字符串,json.dumps()
反序列化:decoding,把json格式字符串解码转换为python数据对象,json.loads()

一般json

查看json使用方法

>>> import json
>>> json.__all__
['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONEncoder']

encoding: dumps()

>>> data = [{"name":"qiwsir", "lang":("python", "english"), "age":40}]
>>> print data
[{'lang': ('python', 'english'), 'age': 40, 'name': 'qiwsir'}]
>>> data_json = json.dumps(data)
>>> print data_json
[{"lang": ["python", "english"], "age": 40, "name": "qiwsir"}]

encoding的操作是比较简单的,请注意观察data和data_json的不同——lang的value从元组变成了列表,还有不同:

>>> type(data_json)

>>> type(data)

将python对象转化为json类型,是按照下表所示对照关系转化的:

python json
dict object
list, tuple array
str, unicode string
int, long, float number
True true
False false
None null

decoding: loads()

decoding的过程也像上面一样简单:

>>> new_data = json.loads(data_json)
>>> new_data
[{u'lang': [u'python', u'english'], u'age': 40, u'name': u'qiwsir'}]

需要注意的是,解码之后,并没有将元组还原。

解码的数据类型对应关系:

json python
object dict
array list, tuple
string str, unicode
number(int) int, long
number(read) float
true True
false False
null None

上面的data都不是很长,还能凑合阅读,如果很长了,阅读就有难度了。所以,json的dumps()提供了可选参数,利用它们能在输出上对人更友好(这对机器是无所谓的)。

>>> data={'a':'aaa', 'b':'bbb', 'c':[{'c1':'cc1', 'c2':'cc2'}]}
>>> data_j = json.dumps(data, sort_keys=True, indent=2)
>>> print data_j
{
  "a": "aaa", 
  "b": "bbb", 
  "c": [
    {
      "c1": "cc1", 
      "c2": "cc2"
    }
  ]
}

sort_keys=True意思是按照键的字典顺序排序,indent=2是让每个键值对显示的时候,以缩进两个字符对齐。这样的视觉效果好多了。

对于字典,json会假设key是字符串(字典中的任何非字符串key都会在编码时转换为字符串),要符合JSON规范,应该只对python列表和字典进行编码。此外,在WEB应用中,把最顶层对象定义为字典是一种标准做法。

大json字符串

如果数据不是很大,上面的操作足够了。但是,上面操作是将数据都读入内存,如果太大就不行了。把数据放入文件,你可以使用 json.dump() 和 json.load() 来编码和解码JSON。

dump功能

# 将数据通过特殊的形式转换为所有程序语言都认识的字符串,并写入文件
>>> with open('tmp.json', 'w') as f:
...   json.dump(data_j, f)
... 

> cat tmp.json
{"a": "aaa", "c": [{"c2": "cc2", "c1": "cc1"}], "b": "bbb"}

load功能

>>> with open('tmp.json', 'r') as f:
...   data = json.load(f)
... 
>>> print data
{u'a': u'aaa', u'c': [{u'c2': u'cc2', u'c1': u'cc1'}], u'b': u'bbb'}
  • 从数据文件中读取数据,并将json编码的字符串转换为python的数据结构

你可能感兴趣的