跳到主要内容

Python 对 JSON 的处理

·286 字·2 分钟

1.什么是 JSON #

JSON 介绍:http://json.org/json-zh.html

JSON 是 JavaScript 对象表示法语法的子集,是一种轻量级的数据交换格式。一个 JSON 对象是 “名称:值” 对的无序集合,用花括号包含,“名称:值” 对包含一个字段名称(在双引号中),然后跟一个冒号,最后是值,例如:

{
    "name": "sample_app",
    "cmd": ["python", "$MOD/sample.py", "-c", "$MOD/init.cfg"],
    "depends": ["modbus_USBV0", "cloud_client", "defaultdb"],
    "version": "1.0.0"
}

这里的值可以是:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在方括号中)
  • 对象(在花括号中)
  • null

2.json 库 #

Python 提供了 json 库(https://docs.python.org/2/library/json.html),可以完成对 JSON 对象的编解码(encoding and decoding),就是 JSON 对象转换为 Python 的数据结构,或者逆过程:

JSONPython
Objectdict
stringstring
numberint,long,float
arraylist,tuple
trueTrue
falseFalse
nullNone

基本操作 #

dumps 方法可以将 Python 数据转换为 JSON 格式的字符串,然后返回,例如:

>>> import json
>>> obj={ 'name':'Bob', 'data':(1,3) }
>>> encodedjson=json.dumps(obj)
>>> print obj
{'data': (1, 3), 'name': 'Bob'}
>>> print encodedjson
{"data": [1, 3], "name": "Bob"}
>>> print type(encodedjson)
<type 'str'>

从输出结果看,元组转换为了数组,字符串改成了双引号。

loads 方法可以将 JSON 格式的字符串转换为 Python 的 dict 结构,例如:

>>> import json
>>> jsoncode='{ "name":"Bob","data":[1,2,3] }'
>>> obj=json.loads(jsoncode)
>>> print obj
{u'data': [1, 2, 3], u'name': u'Bob'}
>>> print type(obj)
<type 'dict'>
>>> print obj['name']
Bob

转换后的字符串前都带有 u 字符,表示这个字符串是 Unicode 编码,并不会影响 dict 的使用。

Encoders and Decoders #

json 模块提供了两个子类 JSONDecoder 和 JSONEncoder ,负责 JSON 的解码和编码。

JSONDecoder 是解码器,提供了两种方法:

  • decode(s) ,将 JSON 结构的字符串 s 转换为 Python 结构,并返回。
  • raw_decode(s) , 同样是解码,但是会返回两个值,第一个是解码后的 Python 结构,第二个值表示解码结束时,走到了 s 的哪个位置,这个方法适用于 s 的末尾有无效数据的情况。

例如:

>>> import json
>>> file=open("package.cfg")
>>> text=file.read()
>>> print text
{
        "name": "sample_app",
        "cmd": ["python", "$MOD/sample.py", "-c", "$MOD/init.cfg"],
        "depends": ["modbus_USBV0", "cloud_client", "defaultdb"],
        "version": "1.0.0"
}

hello

>>> obj,raw=json.JSONDecoder().raw_decode(text)
>>> print obj   
{u'depends': [u'modbus_USBV0', u'cloud_client', u'defaultdb'], u'cmd': [u'python', u'$MOD/sample.py', u'-c', u'$MOD/init.cfg'], u'name': u'sample_app', u'version': u'1.0.0'}
>>> print raw
166
>>> obj=json.JSONDecoder().decode(text)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/json/decoder.py", line 369, in decode
    raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 8 column 1 - line 9 column 1 (char 168 - 174)

package.cfg 的末尾有无效的字符 hello ,用 raw_decode() 可以忽略并解码,用 decode() 就会报错。

JSONEncoder 是编码器,提供了 encode(o) 方法,可以将 Python 结构 o 转换为 JSON 结构的字符串,并返回。