Jun 15, 2011

JSON and json

先要理解 json 的格式

JSON 文件格式


中文和其他 unicode 字符的处理

unicode 不属于 JSON 支持的类型,在 .json 文件里写入的是 unicode 代码,比如
盛夏 Dive into history, 2009 edition 写成 json 文件
"title": "\u76db\u590f Dive into history, 2009 edition"
Q: 如何控制这个编码?

注意在 open 文件时可以控制文件编码,但是文件编码不同于 .json 内容的编码,不管 .json 文件是什么编码,内容都是
\u76db\u590f


python json module

Dive Into Python 3. Chapter 13. Serializing Python Objects
Another tutorial

JSON 支持的数据和 python 数据对应关系:
NotesJSONPython 3
objectdictionary
arraylist
stringstring
integerinteger
real numberfloat
*trueTrue
*falseFalse
*nullNone
* All json values are case-sensitive.

dumps(object): dump to string
dump(object, fp): dump to file

1. json.dump() 也只支持上表右侧的数据
2. json.dump() 也可以 dump tuple,它不区分 list 和 tuple,都 dump 成为 array; 当然 json.load load 成为 list
3. 其他的类型通过编写辅助函数,传递给 json.dump 和 json.load 来处理


def to_json(python_object):
    if isinstance(python_object, time.struct_time):          ①
        return {'__class__': 'time.asctime',
                '__value__': time.asctime(python_object)}    ②
    if isinstance(python_object, bytes):
        return {'__class__': 'bytes',
                '__value__': list(python_object)}
    raise TypeError(repr(python_object) + ' is not JSON serializable')
def from_json(json_object):                                   ①
    if '__class__' in json_object:                            ②
        if json_object['__class__'] == 'time.asctime':
            return time.strptime(json_object['__value__'])    ③
        if json_object['__class__'] == 'bytes':
            return bytes(json_object['__value__'])            ④
    return json_object

两个较通用的辅助函数见Another tutorial

当控制 dump 的输出后,可以用 JSON 文件来比较两个object

javacript 和 json

由于 JSON 一般用在 ajax

0 comments: