Json是一种常用的数据交换结构,由于轻量、易于阅读和编写等特点,在网络方面应用很广。

它的格式一般是这样的:

对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

例如下面这样:

json

JavaScript

1

{"b": "Hello", "c": null, "a": true}

它的值可以是双引号括起来的字符串(string)、数值(number)、truefalsenull、对象(object)或者数组(array)。这些结构可以嵌套。

使用Python编码和解析Json

Python内置了json包来帮助我们完成对json的操作。

将Python的字典结构导出到json使用json.dumps(),将json读成Python的字典结构,使用json.loads()

如果不是针对string操作而是对文件操作,分别使用json.load()函数和json.dump()函数。

json with python

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

import json

data = {

    'name' : 'ACME',

    'shares' : 100,

    'price' : 542.23

}

json_str = json.dumps(data)

data = json.loads(json_str)

# Writing JSON data to file

with open('data.json', 'w') as f:

    json.dump(data, f)

# Reading data back

with open('data.json', 'r') as f:

    data = json.load(f)

默认的类型对应如下:

JSON Python
object dict
array list
string unicode
number (int) int, long
number (real) float
true True
false False
null None

其他数据类型与Json之间的编码和解码

一般来说,Python对json的解析是listdict之间的操作,如果需要其他类型与json之间转换,就需要object_hook参数。先定义一个类,将类的字典初始化成json的key-value键值对。这样,json的参数就变成了类的属性。

将一个JSON字典转换为一个Python对象

Python

1

2

3

4

5

6

7

8

9

10

11

12

>>> class JSONObject:

...     def __init__(self, d):

...         self.__dict__ = d

...

>>>

>>> data = json.loads(s, object_hook=JSONObject)

>>> data.name

'ACME'

>>> data.shares

50

>>> data.price

490.1

还可以通过指定“函数”来进行转换。

用函数来指定序列化的方法,即将对象的“属性-值”对变成字典对,函数返回一个字典,然后json.dumps会格式化这个字典。

如果是通过函数将json变成对象,首先获得类名,然后通过__new__来创建一个对象(不调用初始化函数),然后将json字典的各个属性赋给对象。

使用函数指定json转换方式

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

def serialize_instance(obj):

    d = { '__classname__' : type(obj).__name__ }

    d.update(vars(obj))

    return d

# Dictionary mapping names to known classes

classes = {

    'Point' : Point

}

def unserialize_object(d):

    clsname = d.pop('__classname__', None)

    if clsname:

        cls = classes[clsname]

        obj = cls.__new__(cls) # Make instance without calling __init__

        for key, value in d.items():

            setattr(obj, key, value)

        return obj

    else:

        return d

使用方法如下:

使用方法

Python

1

2

3

4

5

6

7

8

9

10

11

>>> p = Point(2,3)

>>> s = json.dumps(p, default=serialize_instance)

>>> s

'{"__classname__": "Point", "y": 3, "x": 2}'

>>> a = json.loads(s, object_hook=unserialize_object)

>>> a

<__main__.Point object at 0x1017577d0>

>>> a.x

2

>>> a.y

3

参考