zoukankan      html  css  js  c++  java
  • python中json操作了解

    1. 什么是接口?

    交换数据

    http://openweathermap.org/current 

    1. json简介

    JSON 是存储和交换文本信息的语法。类似 XML

    JSON 语法是 JavaScript 语法的子集

    1. Json语法规则

    数据在名称、值对中

    数据由逗号分隔

    花括号保存对象

    方括号保存数组

    Json的值可以是:

    数字(整数或浮点数)

    字符串(在双括号中)

    逻辑值(true或false)

    数组(在方括号中)

    对象(在花括号中)

    Null

    1. json串转换

    Python的json模块序列化和反序列化分别是dumps和loads。
    json.dumps():将一个Python对象编码成JSON字符串。
    json.loads():将JSON格式字符串解码成Python对象。

     

    >>> import json

    >>> json.dumps({1:2})

    '{"1": 2}'

    >>> json.dumps({"a":2})

    '{"a": 2}'

    >>> json.dumps({True:2})

    '{"True": 2}'

    >>> print type(json.dumps({True:2}))

    <type 'str'>

    字典的key会默认转成字符串,整个类型其实就是字符串类型。

     

    >>> json.dumps((1,2,3))

    '[1, 2, 3]'

    >>> json.dumps((1))

    '1'

    >>> json.dumps([1,2,3])

    '[1, 2, 3]'

    >>> json.dumps(True)

    'true'

    >>> json.dumps(False)

    'false'

    >>> json.dumps(None)

    'null'

    >>> json.dumps("abc")

    '"abc"'

    >>> json.dumps([{"a":1,"b":1}])

    '[{"a": 1, "b": 1}]'

    >>> json.dumps([{"a":1,"b":1},{"c":3}])

    '[{"a": 1, "b": 1}, {"c": 3}]'

    >>>

    转换字典类型的最为常用。

     

     

    整体练习例子:

    #coding=utf-8

    import json

     

    a = [{1:12, 'a':12.3}, [1,2,3], (1,2), 'asd', u'ad', 12, 13L, 3.3, True, False, None]

    print u"Python类型: ", a

    print u"编码后的json串: ", json.dumps(a)

     

    1. json.dumps() 加sortkey的作用: 是否按字典排序(a到z)输出。因为默认编码成json格式字符串后,是紧凑输出,并且也没有顺序的,不利于可读。

    #coding=utf-8

    import json

    data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 }]

    print json.dumps(data)

    print json.dumps(data, sort_keys=True)

    结果:

    E:>python a.py

    [{"a": "A", "c": 3.0, "b": [2, 4]}]

    [{"a": "A", "b": [2, 4], "c": 3.0}]

    1. json.dumps() indent设置参数缩进显示的空格数,控制输出格式。

    #coding=utf-8
    import json
    data =  [{"a": "A", "b": [2, 4], "c": 3.0}]
    print json.dumps(data, sort_keys=True, indent=3)

      这里的缩进是每行都有的

    1. json.dumps() separator作用是去掉逗号“ ,” 和分号“ :” 后面的空格

    #coding=utf-8

    import json

     

    data =  [{"a": "A", "b": [2, 4], "c": 3.0}]

    print len(json.dumps(data))

    # 去掉编码后的json串中,和:后面的空格

    print len(json.dumps(data, separators=(',',':')))

     

     

    1. json.dumps() skipkeys在encoding过程中,dict对象的key只可以是基本数据类型(str,unicode,int,long,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) #skipkeys参数默认为False时

    except Exception, e:

      print e

    print u"设置skipkeys 参数"

    print json.dumps(data, skipkeys=True)# skipkeys=True时

     

    1. dumps()的作用,由于python只在自己的编译环境中有效,这里用dumps()把python的对象转换成服务器能够识别的字符串。

     

    1. json.loads 将简单数据类型解码成python

    #coding=utf-8

    import json

    data = [{'a':"Aasdf",'b':(2,4),'c':3.0}]

    data_json = json.dumps(data)

    print "encoding :", data_json

    print "decoding :", json.loads(data_json)

    结果:

    E:>python a.py

    encoding : [{"a": "Aasdf", "c": 3.0, "b": [2, 4]}]

    decoding : [{u'a': u'Aasdf', u'c': 3.0, u'b': [2, 4]}]

     

    结果中的unicode怎么转换成string类型?

    方法一:直接str()

    >>> type(str(u"a"))
    <type 'str'>

    方法二:encode
    >>> type(u"a".encode("gbk"))
    <type 'str'>

     

    小练习:

    encoding : [{"a": "Aasdf", "c": 3.0, "b": [2, 4]}]

    decoding : [{u'a': u'Aasdf', u'c': 3.0, u'b': [2, 4]}]

    如何把decoding中的u去掉?

    老师的方法:

    #coding=utf-8

    import json

    data = [{'a':"Aasdf",'b':(2,4),'c':3.0}]

    data_json = json.dumps(data)

    print "encoding :", data_json

    print "decoding :", json.loads(data_json)

    s= json.loads(data_json)

    d=s[0]

    new_d={}

    new_list=[]

    for k,v in d.items():

        if isinstance(v,unicode):

            new_d[str(k)]=str(v)

        else:

            new_d[str(k)]=v

    new_list.append(new_d)

    print new_list

     

    同学的方法:更严谨的判定逻辑

    for key,value in dict_a.items():

            if isinstance(key,unicode) and isinstance(value,unicode):

                result[str(key)]=str(value)

            elif isinstance(key,unicode) and not isinstance(value,unicode):

                result[str(key)]=value

            elif not isinstance(key,unicode) and isinstance(value,unicode):

                result[key]=str(value)

            elif not isinstance(key,unicode) and not isinstance(value,unicode):

                result[key]=value

        return result

     

     

    1. Json到python类型转换:转换回来的类型中是没有tuple的,转换后都是unicode类型。

    >>> json.loads('1')
    1
    >>> json.loads('{"a":"1"}')
    {u'a': u'1'}
    >>> json.loads('["1","2"]')
    [u'1', u'2']
    >>> json.loads('1.2')
    1.2
    >>> json.loads('true')
    True
    >>> json.loads('false')
    False
    >>> json.loads('null')
    >>> type(json.loads('null'))

     

    例题:json转python

    #coding=utf-8
    import json
    a = [{1:12, 'a':12.3}, [1,2,3], (1,2), 'asd', u'ad', 12, 13L, 3.3, True, False, None]
    print u"编码后 ", json.dumps(a)
    print u"解码后 ", json.loads(json.dumps(a))

    结果:

    E:>python a.py

    编码后

    [{"a": 12.3, "1": 12}, [1, 2, 3], [1, 2], "asd", "ad", 12, 13, 3.3, true, false,null]

    解码后

    [{u'a': 12.3, u'1': 12}, [1, 2, 3], [1, 2], u'asd', u'ad', 12, 13, 3.3, True, False, None]

     

    1. 将类对象转换成json串

    方法一:

    #encoding=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', '18223423423')  返回成一个字典

    print json.dumps(emp, default = emp.obj_json)

    结果:

    E:>python a.py

    {"age": 24, "tel": "18223423423", "name": "Lily", "sex": "female"}

     

    方法一中的类变形:

    #encoding=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):
        return {
          'name': self.name ,
          'age': self.age,
          'sex': self.sex,
          'tel': self.tel 
     }
    emp = Employee('Lily', 24, 'female', '18223423423')
    print json.dumps(emp.obj_json())

     

    方法二:先转成dict,然后再被序列化成json串。

    #encoding=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', '18223423423')

    print emp.__dict__

    print(json.dumps(emp, default = lambda Employee: Employee.__dict__))

    print(json.dumps(emp, default = lambda emp: emp.__dict__))

    结果:

    E:>python a.py

    {'age': 24, 'tel': '18223423423', 'name': 'Lily', 'sex': 'female'}

    {"age": 24, "tel": "18223423423", "name": "Lily", "sex": "female"}

    {"age": 24, "tel": "18223423423", "name": "Lily", "sex": "female"}

     

    1. json反序列化为类对象

    #encoding=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', '18223423423')

    def jsonToClass(emp):

        return Employee(emp['name'], emp['age'], emp['sex'], emp['tel'])

    json_str = '{"name": "Lucy", "age": 21, "sex": "female", "tel": "15834560985"}'

    e = json.loads(json_str, object_hook = jsonToClass)  

    print e 

    print e.name 

    object_hook = jsonToClass  命名参数传递

     

    结果:

    E:>python a.py

    <__main__.Employee object at 0x01AF5970>

    Lucy

  • 相关阅读:
    js/Jquery table 内部控件计算和tr的生成
    反射 实体类的赋值/取值问题
    C#读取Excel 几种方法的体会
    水晶报表升级遇到的问题
    使用异或位运算符实现交换两个整数详解
    美国宇航局两万兆数据存储方案下载
    Flash全屏(转载)
    Unity3D实现动态加载游戏资源
    C#,ASP.NET jquery uploadify上传控件中文乱码解决办法
    HTML通过button触发inputfile控件上传文件的问题
  • 原文地址:https://www.cnblogs.com/qingqing-919/p/8620413.html
Copyright © 2011-2022 走看看