Python 操作json

发布时间:2019-06-23 08:43:10编辑:auto阅读(1872)

    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之再说编码

下一篇: Python之字典