zoukankan      html  css  js  c++  java
  • python 解析json

    一、概念

    序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON、XML等。反序列化就是从存储区域(JSON,XML)读取反序列化对象的状态,重新创建该对象。

    JSON(JavaScript Object Notation):一种轻量级数据交换格式,相对于XML而言更简单,也易于阅读和编写,机器也方便解析和生成,Json是JavaScript中的一个子集。

    Python2.6开始加入了JSON模块,无需另外下载,Python的Json模块序列化与反序列化的过程分别是 encoding和 decoding

    encoding:把一个Python对象编码转换成Json字符串
    decoding:把Json格式字符串解码转换成Python对象
    对于简单数据类型(string、unicode、int、float、list、tuple、dict),可以直接处理。

    二、对简单数据类型的encoding 和 decoding

    使用简单的json.dumps方法对简单数据类型进行编码,例如:

    1 import json
    2  
    3 obj = [[1,2,3],123,123.123,'abc',{'key1':(1,2,3),'key2':(4,5,6)}]
    4 encodedjson = json.dumps(obj)
    5 print repr(obj)
    6 print encodedjson

    输出:

    [[1, 2, 3], 123, 123.123, 'abc', {'key2': (4, 5, 6), 'key1': (1, 2, 3)}] 
    [[1, 2, 3], 123, 123.123, "abc", {"key2": [4, 5, 6], "key1": [1, 2, 3]}]

    通过输出的结果可以看出,简单类型通过encode之后跟其原始的repr()输出结果非常相似,但是有些数据类型进行了改变,例如上例中的元组则转换为了列表。在json的编码过程中,会存在从python原始类型向json类型的转化过程,具体的转化对照如下:

    json.dumps()方法返回了一个str对象encodedjson,我们接下来在对encodedjson进行decode,得到原始数据,需要使用的json.loads()函数:

    1 decodejson = json.loads(encodedjson)
    2 print type(decodejson)
    3 print decodejson[4]['key1']
    4 print decodejson

    输出:

    <type 'list'> 
    
    [1, 2, 3]
    
    [[1, 2, 3], 123, 123.123, u'abc', {u'key2': [4, 5, 6], u'key1': [1, 2, 3]}]

    loads方法返回了原始的对象,但是仍然发生了一些数据类型的转化。比如,上例中‘abc’转化为了unicode类型。从json到python的类型转化对照如下:

     

    json.dumps方法提供了很多好用的参数可供选择,比较常用的有sort_keys(对dict对象进行排序,我们知道默认dict是无序存放的),separators,indent等参数。

    具体详见:http://www.cnblogs.com/coser/archive/2011/12/14/2287739.html

    三、实例

     某个接口的返回值为json

    {"code":0,"message":null,"object":["uid":"50015473","create_time":"2015-11-12 10:46:04.0","task_id":"711589","package_name":"yc_agent","version_id":175120,"install_path":"/data/services/yc_agent_1.6.2","version":"nmob_1.6.2"}],"success":true}

    我们想取某个数据,可以先loads解码转化为Python对象,然后进行操作

     1 task_url = 'http://www.google.com/TaskId.do?task_id=%s' % start_json['object']['taskId']
     2 task_html = urllib2.urlopen(task_url)
     3 task_json = json.loads(task_html.read())
     4 
     5 if start_json['code'] == 0:
     6         print "package %s start succees!" % task_json['object'][0]['package_name']
     7 else:
     8         print "package %s start error!" % task_json['object'][0]['package_name']
     9 
    10 task_html.close()   

     

  • 相关阅读:
    http://blog.csdn.net/steveguoshao/article/details/38414145
    http://www.tuicool.com/articles/EjMJNz
    http://jingyan.baidu.com/article/7f41ecec1b7a2e593d095ce6.html
    Linux 查看当前时间和修改系统时间
    http://m.blog.csdn.net/article/details?id=49132747
    http://www.cnblogs.com/nick-huang/p/4848843.html
    javaScript事件(一)事件流
    jQuery选择器
    超链接a的target属性
    html基础总结版
  • 原文地址:https://www.cnblogs.com/langdashu/p/4963098.html
Copyright © 2011-2022 走看看