xiaoxiong's blog Thinking and Action

python2 json的处理

2016-10-07

简述

python2 json的学习和使用

注意

json 中对于字典中的字符串,不管是键还是值都用双引号,

使用单引号报错:

print json.loads(dict_msg)
  File "C:\Python27\lib\json\__init__.py", line 339, in loads
      return _default_decoder.decode(s)
        File "C:\Python27\lib\json\decoder.py", line 364, in decode
	    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
	    TypeError: expected string or buffer

可以用下面的方法转换

json_string=json.dumps(s)
python_obj=json.loads(json_string)

json的使用

python中自带有json的处理模块,只需要import json就行

pythonjson转换表

python 转 json

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

json 转 python

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

json数据中falsetrue对应python中的False, True; null对应python中的None

注意:通过表可以看见在转换的时候tuple会转换成array,并且在通过load方式也只会转换成list,对于str编码都会转换成unicode,如果使用则需要在使用前添加适当处理

基本使用

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)

json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[,object_pairs_hook[, **kw]]]]]]]])

将python对象生成json

json.dumps(data)    #生成json字符串
json.dump(data,file)     #生成json类文件对象

将json对象转换成python

json.loads(str)    #解析json字符串
json.load(file)    #解析json类文件对象

注意在使用loads方法时,若str为空会报错。

json中unicode使用

json中utf-8编码输出

>>> js = json.loads('{"language": "中文 / Chinese "}')
>>> print json.dumps(js)
{"language": "\u4e2d\u6587 / Chinese "}
>>> print json.dumps(js,ensure_ascii=False)
{"language": "中文 / Chinese "}

其他编码转换成json对象

可以看见在json.dumps(data)中默认encoding=utf-8转换成unicode编码,所以其他编码输入需要设置encoding

>>> str = u'中文'
>>> gbk_str = str.encode('gb2312')
>>> type(gbk_str)
<type 'str'>
>>> json_str = json.dumps(gbk_str)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/json/__init__.py", line 243, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
    return encode_basestring_ascii(o)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
>>> json_str = json.dumps(gbk_str,encoding='gb2312')
>>> type(json_str)
<type 'str'>
>>> print json_str
"\u4e2d\u6587"

将对象json化

import json

class Student(object):
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score
		
s = Student('Bob', 20, 88)		

对于dumps()方法,其中default参数定义了如何将任意一个对象变成可序列为json的对象,所以需要一个转换函数

def student2dict(std):
    return {
        'name': std.name,
        'age': std.age,
        'score': std.score
    }

将类实例通过转换函数转换成dict,再序列化为json对象

json.dumps(s, default=student2dict)

可以使用实例的__dict__属性,dict属性用来存储实例变量

json.dumps(s, default=lambda obj: obj.__dict__)  

json反序列化,loads()方法首先转换出一个dict对象,然后object_hook参数,将dict转换成类实例

def dict2student(d):
    return Student(d['name'], d['age'], d['score'])
	
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
json.loads(json_str, object_hook=dict2student)

漂亮的输出

  1. pprint()代替print输出,输出json
  2. 添加indent参数,输出python对象json.dumps(data, indent=4, ensure_ascii=False)

参考


Comments