Python操作json, Python读写json, Python 读写JSON数据, Python对json的操作及实例解析

json介绍

说明:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition – December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。

 

关于json更为详细的内容,可以参考其官方网站:http://www.json.org
从官方网站上摘取部分,了解一下json的结构:
JSON建构于两种结构:

  • 名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
  • 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
  • python标准库中有json模块,主要是执行序列化和反序列化功能:

序列化:encoding,把一个python对象编码转化成json字符串,json.dumps()
反序列化:decoding,把json格式字符串解码转换为python数据对象,json.loads()

 

一般json

查看json使用方法

>>> import json
>>> json.__all__
['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONEncoder']

 

encoding: dumps()

>>> data = [{"name":"qiwsir", "lang":("python", "english"), "age":40}]
>>> print data
[{'lang': ('python', 'english'), 'age': 40, 'name': 'qiwsir'}]
>>> data_json = json.dumps(data)
>>> print data_json
[{"lang": ["python", "english"], "age": 40, "name": "qiwsir"}]

 

encoding的操作是比较简单的,请注意观察data和data_json的不同——lang的value从元组变成了列表,还有不同:

>>> type(data_json)
<type 'str'>
>>> type(data)
<type 'list'>

 

将python对象转化为json类型,是按照下表所示对照关系转化的:

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

 

decoding: loads()

decoding的过程也像上面一样简单:

>>> new_data = json.loads(data_json)
>>> new_data
[{u'lang': [u'python', u'english'], u'age': 40, u'name': u'qiwsir'}]

需要注意的是,解码之后,并没有将元组还原。

解码的数据类型对应关系:

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

上面的data都不是很长,还能凑合阅读,如果很长了,阅读就有难度了。所以,json的dumps()提供了可选参数,利用它们能在输出上对人更友好(这对机器是无所谓的)。

>>> data={'a':'aaa', 'b':'bbb', 'c':[{'c1':'cc1', 'c2':'cc2'}]}
>>> data_j = json.dumps(data, sort_keys=True, indent=2)
>>> print data_j
{
  "a": "aaa", 
  "b": "bbb", 
  "c": [
    {
      "c1": "cc1", 
      "c2": "cc2"
    }
  ]
}

sort_keys=True意思是按照键的字典顺序排序,indent=2是让每个键值对显示的时候,以缩进两个字符对齐。这样的视觉效果好多了。

对于字典,json会假设key是字符串(字典中的任何非字符串key都会在编码时转换为字符串),要符合JSON规范,应该只对python列表和字典进行编码。此外,在WEB应用中,把最顶层对象定义为字典是一种标准做法。

 

大json字符串

如果数据不是很大,上面的操作足够了。但是,上面操作是将数据都读入内存,如果太大就不行了。把数据放入文件,你可以使用 json.dump() 和 json.load() 来编码和解码JSON。

 

JSON 函数

使用 JSON 函数需要导入 json 库:import json

函数 描述
json.dumps 将 Python 对象编码成 JSON 字符串
json.loads 将已编码的 JSON 字符串解码为 Python 对象

 

dump功能

# 将数据通过特殊的形式转换为所有程序语言都认识的字符串,并写入文件
>>> with open('tmp.json', 'w') as f:
...   json.dump(data_j, f)
... 

> cat tmp.json
{"a": "aaa", "c": [{"c2": "cc2", "c1": "cc1"}], "b": "bbb"}

 

load功能

>>> with open('tmp.json', 'r') as f:
...   data = json.load(f)
... 
>>> print data
{u'a': u'aaa', u'c': [{u'c2': u'cc2', u'c1': u'cc1'}], u'b': u'bbb'}

 

  • 从数据文件中读取数据,并将json编码的字符串转换为python的数据结构

Json处理中文问题:

关于python字符串的处理问题,如果深入的研究下去,我觉得可以写2篇文章了(实际上自己还没整很明白),在这里主要还是总结下使用python2.7.11处理json数据的问题。前期做接口测试,处理最多的事情就是,把数据组装成各种协议的报文,然后发送出去。然后对返回的报文进行解析,后面就遇到将数据封装在json内嵌入在http的body内发送到web服务器,然后服务器处理完后,返回json数据结果的问题。在这里面就需要考虑json里有中文数据,怎么进行组装和怎么进行解析,以下是基础学习的一点总结:

第一:Python 2.7.11的默认编码格式是ascii编码,而python3的已经是unicode,在学习编解码的时,有出现乱码的问题,也有出现list或者dictionary或者tuple类型内的中文显示为unicode的问题。出现乱码的时候,应该先看下当前字符编码格式是什么,再看下当前文件编码格式是什么,或者没有设置文件格式时,查看下IDE的默认编码格式是什么。最推崇的方式当然是每次编码,都对文件编码格式进行指定,如在文件前 设置# coding= utf-8。

第二:字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编码。encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312’),表示将unicode编码的字符串str2转换成gb2312编码。因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码

第三:将json数据转换成python数据后,一般会得到一个dict类型的变量,此时内部的数据都是unicode编码,所以中文的显示看着很痛苦,但是对于dict得到每个key的value后,中文就能正常显示了,如下所示:

# coding= utf-8
import json
import sys

if __name__ == '__main__':
    # 将python对象test转换json对象
    test = {"username":"测试","age":16}
    print type(test)
    python_to_json = json.dumps(test,ensure_ascii=False)
    print python_to_json
    print type(python_to_json)

    # 将json对象转换成python对象
    json_to_python = json.loads(python_to_json)
    print type(json_to_python)
    print json_to_python['username']

运行结果:

Python操作json, Python读写json, Python 读写JSON数据, Python对json的操作及实例解析
Python操作json, Python读写json, Python 读写JSON数据, Python对json的操作及实例解析

 

使用第三方库:Demjson

Demjson 是 python 的第三方模块库,可用于编码和解码 JSON 数据,包含了 JSONLint 的格式化及校验功能。

Github 地址:https://github.com/dmeranda/demjson

官方地址:http://deron.meranda.us/python/demjson/

 

环境配置

在使用 Demjson 编码或解码 JSON 数据前,我们需要先安装 Demjson 模块。本教程我们会下载 Demjson 并安装:

$ tar -xvzf demjson-2.2.3.tar.gz
$ cd demjson-2.2.3
$ python setup.py install

更多安装介绍查看:http://deron.meranda.us/python/demjson/install

 

 

本文: Python操作json, Python读写json, Python 读写JSON数据, Python对json的操作及实例解析

Leave a Reply