Python 操作json

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 操作json相关的知识,希望对你有一定的参考价值。

Json语法规则: 数据在名称/值对中 数据由逗号分隔 花括号保存对象 方括号保存数组 Json字符串本质上是一个字符串,用单引号表示 Json数据的书写格式 名称--值对,包括名称字段(在双引号中),后面跟一个冒号,然后是值: “name”: ”zhangsan” 等价于name = “zhangsan” Json值 值可以是 数字(整数或浮点数) 字符串(双引号括起来) 逻辑值(true或false) 数组(在方括号中) 对象(在花括号中) null Json对象 Json的对象是在大括号中的, {“name”:”zhangsan”,”age”:20} 等价 name=”zhangsan” age = 20 Json数组 Json数组是在中括号中的,数组可以包含多个对象 { "employees": [ { "firstName":"John" , "lastName":"Doe" }, { "firstName":"Anna" , "lastName":"Smith" }, { "firstName":"Peter" , "lastName":"Jones" } ] } Employees是包含三个对象的数组 编码Json.dumps() 将一个python对象编码成json字符串, Python的列表转换成json数组 >>> json.dumps([1,2,3,"a"]) ‘[1, 2, 3, "a"]‘ Python的字符串转换成json字符串 >>> json.dumps("abc123") ‘"abc123"‘ Python元组转换成json数组 >>> json.dumps((1,2,3,"abc")) ‘[1, 2, 3, "abc"]‘ Python的字典转换成json的对象 >>> json.dumps({1:"a",2:"b",3:"c"}) ‘{"1": "a", "2": "b", "3": "c"}‘‘#注意1、2、3被加上了双引号,因为json的名称是必须要加双引号的 Python的数字(int)转换成json的数字 >>> json.dumps(1235) ‘1235‘ Python的unicode字符串转换成json的字符串 >>> json.dumps(u"abcd") ‘"abcd"‘ Python的True转换成json的true >>> json.dumps(True) ‘true‘ Python的False转换成json的false >>> json.dumps(False) ‘false‘ Python的None转换成json的null >>> json.dumps(None) ‘null‘ >>> type(json.dumps("[1,2,3]")) #json本质上是一个字符串 <class ‘str‘> >>> type(json.dumps("abc")) <class ‘str‘> Python类型和json类型的对应关系 怎么判断一个json 是不是合法的? 用try except try: json.loads(‘"abc"‘) except Exception,e: print e else: print "ok" json.dumps()函数参数应用 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字符串 sort_keys 是否按key排序,sort_keys = True升序排序 >>> data = [{"a":"A",‘d‘:4,"b":(2,4),"c":3.0}] >>> print(json.dumps(data)) [{"a": "A", "d": 4, "b": [2, 4], "c": 3.0}] >>> print(json.dumps(data,sort_keys=True)) [{"a": "A", "b": [2, 4], "c": 3.0, "d": 4}] indent 设置参数缩进显示的空格数。缩进显示使读起来更加清晰。 >>> import json >>> data = [{"a": "A", "b": [2, 4], "c": 3.0}] >>> print(json.dumps(data,sort_keys=True,indent=4)) [ { "a": "A", "b": [ 2, 4 ], "c": 3.0 } ] Separators 参数的作用是去掉逗号“,”和分号“:”后面的空格,从上面的输出果都能看到“,”与“:”后面都有个空格,这都是为了美化输出结果的作用,但是在我们传输数据的过程中,越精简越好,冗余的东西全部去掉,因此就可以加上separators参数对传输的json串进行压缩。该参数是元组格式的 >>> import json >>> data = [{"a": "A", "b": [2, 4], "c": 3.0}] >>> print(len(json.dumps(data))) 35 >>> print(len(json.dumps(data,separators=(‘,‘,‘:‘)))) 29 skipkeys 在encoding过程中,dict对象的key只可以是基本数据类型(str,unicode,int,float,bool,None),如果是其他类型,那么在编码过程中就会抛出TypeError的异常。skipkeys可以跳过那些非string对象的key的处理,就是不处理 #coding=utf-8 import json data = [{‘a‘:‘A‘,‘b‘:(2,4),‘c‘:3.0,(1,2):‘D tuple‘}] print(u"不设置skipkeys 参数") try: res1 = json.dumps(data) except Exception as e: print(e) print(u"设置skipkeys 参数") print(json.dumps(data,skipkeys=True)) json.loads() 将一个json字符串解码成python对象 解码json对象到python字典 >>> import json >>> json.loads(‘{"a":1,"b":2}‘)#注意外面有单引号 {‘a‘: 1, ‘b‘: 2} 解码json数组到python的列表 >>> json.loads(‘["a","b",2]‘) [‘a‘, ‘b‘, 2] 解码json的字符串到python的字符串 >>> json.loads(‘"abc"‘) ‘abc‘ 解码json的true\false到python的True,False >>> json.loads(‘true‘) True >>> json.loads(‘false‘) False 解码json的null到python的None >>> print(json.loads(‘null‘)) None 解码json的数字到python的int、float >>> json.loads(‘123‘) 123 >>> json.loads(‘123.20‘) 123.2 >>> a =[{1:12,‘a‘:12.3},[1,2,3],(1,2),‘abc‘,u"ab",12] >>> print("编码后:\n",json.dumps(a)) 编码后: [{"1": 12, "a": 12.3}, [1, 2, 3], [1, 2], "abc", "ab", 12] >>> print("解码后: ",json.loads(json.dumps(a))) 解码后: [{‘1‘: 12, ‘a‘: 12.3}, [1, 2, 3], [1, 2], ‘abc‘, ‘ab‘, 12] 注意: json格式的字符串解码成Python对象以后,String类型都变成了str类型,数组变成了list,不会回到原来的元组类型,字典key的字符类型也被转成字符串类型 从json到python的类型转换 将类对象编码成json串 Python中的dict对象可以直接序列化为json的{},但是很多时候,可能用class表示对象,比如定义Employe类,然后直接去序列化就会报错。原因是类不是一个可以直接序列化的对象,但我们可以使用dumps()函数中的default参数来实现 #coding=utf-8 import json class Employee(object): def __init__(self,name,age,sex,tel): self.name = name self.age = age self.sex = sex self.tel = tel #将序列化函数定义到类里面 def obj_json(self,obj_instance): return { #返回一个字典 ‘name‘ : obj_instance.name, ‘age‘ : obj_instance.age, ‘sex‘ : obj_instance.sex, ‘tel‘ : obj_instance.tel} emp =Employee("Lily",24,"female","18212345678") print(json.dumps(emp,default = emp.obj_json))#编码成json对象 #coding=utf-8 import json class Employee(object): def __init__(self,name,age,sex,tel): self.name = name self.age = age self.sex = sex self.tel = tel #将序列化函数定义到类里面 def obj_json(self,obj_instance): return { ‘name‘ : obj_instance.name, ‘age‘ : obj_instance.age, ‘sex‘ : obj_instance.sex, ‘tel‘ : obj_instance.tel} emp =Employee("Lily",24,"female","18212345678") print(emp.__dict__) print(json.dumps(emp,default=lambda Employee:Employee.__dict__)) print(json.dumps(emp,default = lambda emp:emp.__dict__)) Json反序列化为对象 json串反序列化成类对象或类的实例,使用的是loads()方法中的object_hook参数来实现 #coding=utf-8 import json class Employee(object): def __init__(self,name,age,sex,tel): self.name = name self.age = age self.sex = sex self.tel = tel #emp = Employee(‘Lily‘,24,‘female‘,‘13112345678‘) def jsonToClass(emp): return Employee(emp[‘name‘],emp[‘age‘],emp[‘sex‘],emp[‘tel‘]) json_str = ‘{"name":"Lucy","age":21,"sex":"female","tel":"13510163252"}‘#需要反序列化的对象 e = json.loads(json_str,object_hook = jsonToClass)#通过loads反序列化得到对象e print(e) print(e.name)

以上是关于Python 操作json的主要内容,如果未能解决你的问题,请参考以下文章

漂亮的打印 JSON python

python与json的数据转换

使用 Json Python 格式化 Websocket 数据

使用 json python 存储频道 ID 和公会 ID

InstagramAPI - 如何将 JSON Python 数据解析为 Pandas DataFrame(iPython、Jupyter Notebook)

如何将有效json中的字符串json转换为有效的json python