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建构于两种结构:
“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
二、引用模块
import json
三、相关函数
1.编码(encode):把一个python对象编码转换成json字符串 json.dumps()
2.解码(decode):把json格式字符串解码转换成python对象 json.loadS()
四、具体实例
实例一:json.dumps()
import json
s = json.loads('{"name":"test","type":{"name":"seq","parameter":["1","2"]}}')
print type(s)
print s.keys()
print s["name"]
print s["type"]
print s["type"]["name"]
程序执行结果如下:
<type 'dict'>
[u'type', u'name'] #此处输出结果:可以看出字典是无序的
test
{u'parameter': [u'', u''], u'name': u'seq'}
seq
实例二:json.dumps() json.loads()
import json
data = {'a':123,'b':[1,2]}
d1 = json.dumps(data)
print type(data)
print type(d1)
print len(d1)
print d1
for i in range(len(d1)):
print d1[i]
d2 = json.loads(d1)
print type(d2)
print d2
print d2.keys()
print d2.values()
for k in d2.keys():
print k,d2[k]
实例三
import json #encode
obj = [[1,2,3],123,123.123,'abc',{'key1':(1,2,3),'key2':(4,5,6)}]
print type(obj)
encodedjson = json.dumps(obj)
print type(encodedjson)
print len(encodedjson)
print repr(obj)
print encodedjson #decode
decodejson = json.loads(encodedjson)
print type(decodejson)
print decodejson[4]['key1']
print decodejson
程序执行结果:
<type 'list'>
<type 'str'>
72
[[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]}]
<type 'list'>
[1, 2, 3]
[[1, 2, 3], 123, 123.123, u'abc', {u'key2': [4, 5, 6], u'key1': [1, 2, 3]}]
通过输出的结果可以看出,简单类型通过encode之后跟其原始的repr()输出结果非常相似,但是有些数据类型进行了改变,例如上例中的元组则转换为了列表。在json的编码过程中,会存在从python原始类型向json类型的转化过程,具体的转化对照如下:

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

json.dumps方法提供了很多好用的参数可供选择,比较常用的有sort_keys(对dict对象进行排序,我们知道默认dict是无序存放的),separators,indent等参数。
五、排序
data1 = {'b':789,'c':456,'a':123}
data2 = {'a':123,'b':789,'c':456}
print type(data1)
print type(data2)
d1 = json.dumps(data1,sort_keys=True)
print type(d1)
print d1
#此处是for循环,将json字符串打印输出
print len(d1)
for i in range(30):
print d1[i]
for i in range(len(d1)):
print d1[i]
需要注意的知识点:当字典转换成json字符串之后,每一个字符都是一个单独的元素,和我们通常意义上理解的字符串就不同了,不过依然可以通过下标的方式来进行获取
完整的代码如下:
data1 = {'b':789,'c':456,'a':123}
data2 = {'a':123,'b':789,'c':456}
print type(data1)
print type(data2)
d1 = json.dumps(data1,sort_keys=True)
print type(d1)
d2 = json.dumps(data2)
print type(d2)
d3 = json.dumps(data2,sort_keys=True)
print d1
print d2
print d3
print d1 == d2
print d1 == d3
程序输出结果:
<type 'dict'>
<type 'dict'>
<type 'str'>
<type 'str'>
{"a": 123, "b": 789, "c": 456}
{"a": 123, "c": 456, "b": 789}
{"a": 123, "b": 789, "c": 456}
False
True
说明:
本来data1和data2数据应该是一样的,但是由于dict存储的无序特性,造成两者无法比较。因此两者可以通过排序后的结果进行存储就避免了数据比较不一致的情况发生,
但是排序后再进行存储,系统必定要多做一些事情,也一定会因此造成一定的性能消耗,所以适当排序是很重要的
六、缩进参数
import json
data1 = {'b':789,'c':456,'a':123}
d1 = json.dumps(data1,sort_keys=True,indent=4)
print type(data1)
print type(d1)
print d1
print len(d1) #for循环:依次将json字符串打印输出
for i in range(len(d1)):
print d1[i]
程序执行结果如下:
<type 'dict'>
<type 'str'>
{
"a": 123,
"b": 789,
"c": 456
}
indent参数是缩进的意思,它可以使得数据存储的格式变得更加优雅
七、压缩
import json
a = {'a': 123,'c': 456,'b': 789}
print type(a)
print a
print len(repr(a)) b = json.dumps(a,separators=(',',':'))
print type(b)
print b
print len(repr(b))
程序执行结果:
<type 'dict'>
{'a': 123, 'c': 456, 'b': 789}
30
<type 'str'>
{"a":123,"c":456,"b":789}
27
八、参考文章
http://www.cnblogs.com/kaituorensheng/p/3877382.html
http://www.cnblogs.com/coser/archive/2011/12/14/2287739.html
python解析json文件之简介的更多相关文章
- python解析jSON文件
一.jSON文件 http://baike.baidu.com/link?url=wYeeLnhpXX-Tt8AoBRSNPh2P7Z2YHyK2tdD1tbBOQMfJIpA-YNHMOg2ZN6a ...
- python解析json文件报错No JSON object could be decoded
2017-04-25 可用Nodepad++将json文件打开并以UTF8无BOM格式保存.
- python解析json文件信息到csv中
json格式多种多样,本代码着重看函数部分 import json, csv, os import pandas as pd josns_root = 'jsons' csvs_root = 'csv ...
- python 解析json loads dumps
认识 引用模块 重要函数 案例 排序 缩进参数 压缩 参考 认识 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standa ...
- python脚本解析json文件
python脚本解析json文件 没写完.但是有效果.初次尝试,写的比较不简洁... 比较烦的地方在于: 1,中文编码: pSpecs.decode('raw_unicode_escape') 2,花 ...
- 使用Python解析JSON数据的基本方法
这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下: ----------------------------------- ...
- Android--------使用gson解析json文件
##使用gson解析json文件 **json的格式有两种:** **1. {}类型,及数据用{}包含:** **2. []类型,即数据用[]包含:** 下面用个例子,简单的介绍gson如何解析jso ...
- JAVA简便解析json文件
JAVA简便解析json文件 首先放上我要解析的json文件: { "resultcode":"200", "reason":"S ...
- Python解析Wav文件并绘制波形的方法
资源下载 #本文PDF版下载 Python解析Wav文件并绘制波形的方法 #本文代码下载 Wav波形绘图代码 #本文实例音频文件night.wav下载 音频文件下载 (石进-夜的钢琴曲) 前言 在现在 ...
随机推荐
- Cookie、Session登陆验证相关介绍和用法
一.Cookie和Session 首先.HTTP协议是无状态的:所谓的无状态是指每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应直接影响,也不会直接 ...
- 【已解决】React中配置Sass引入.scss文件无效
React中配置Sass引入.scss文件无效 在react中使用sass时,引入.scss文件失效 尝试很多方法没法解决,最终找到解决方法,希望能帮助正在坑里挣扎的筒子~ 在node_modules ...
- Hibernate(三): org.hibernate.HibernateException: No CurrentSessionContext configured!
Hibernate版本5.2.9 获取Session的方式是sessionFactory.getCurrentSession(); 比较老一些的版本使用的是sessionFactory.openSes ...
- WPF经纬度控件
1.需求及思路 绘制一个控件,可以设置经纬度,经纬度用double类型表示,支持绑定数据,数据更改通知.错误验证,输入检校. 大致设计界面如下图: 2.主要代码 主要代码在于计算,double类型转换 ...
- requests+正则爬取豆瓣图书
#requests+正则爬取豆瓣图书 import requests import re def get_html(url): headers = {'User-Agent':'Mozilla/5.0 ...
- 有些ES6方法极简,但是性能不够好
So,也许你觉得ES6让你视野大开,但是并不是性能也能跟得上~ 首先,让我们先来一个简单的性能测试: 数组去重 es5写法: function delSame(arr){ var n = []; ; ...
- webstorm中github的配置
1.申请一个github账号,我这里的操作是已经有了账号的情况之下进行的. 打开webstorm,File-->settings,弹出settings框,输入git,得到以下界面,输入githu ...
- [LeetCode] Binary Tree Longest Consecutive Sequence II 二叉树最长连续序列之二
Given a binary tree, you need to find the length of Longest Consecutive Path in Binary Tree. Especia ...
- C++11 作用域内枚举
enum class MyEnum{ P1 = , P2, P3, P4, P5 }; MyEnum myEnum = MyEnum::P2; 使用作用域的方式获取并限定P2的值.之所以要使用作用域, ...
- [SDOI2008]Sandy的卡片
题目描述 Sandy和Sue的热衷于收集干脆面中的卡片. 然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型. 每一张卡片都由一些数字进行标记,第i张卡片的 ...