JSON详解
版本：v1.1
Crifan Li
摘要
本文主要介绍了JSON的基础知识，以及在具体（Python，C#等）编程语言中，如何处理JSON，以及常见错误和解决办法。
本文提供多种格式供：

HTML版本的在线地址为：
http://​www.crifan.com/​files/​doc/​docbook/​json_​tutorial/​release/​html/​json_​tutorial.html
有任何意见，建议，提交bug等，都欢迎去讨论组发帖讨论：
http://​www.crifan.com/​bbs/​categories/​json_​tutorial/
在线阅读	HTML  1	HTMLs  2	PDF  3	CHM  4	TXT  5	RTF  6	WEBHELP  7	
下载（7zip压缩包）	HTML  8	HTMLs  9	PDF  10	CHM  11	TXT  12	RTF  13	WEBHELP  14	
修订历史	
修订 1.1	2013-09-05	crl	
· 	把之前教程的地址整理过来
· 	把Python语言总结中对应的Python的json内容整理过来
· 		
JSON详解:
Crifan Li
版本：v1.1
出版日期 2013-09-05
版权 © 2013 Crifan, http://​crifan.com

本文章遵从：署名-非商业性使用 2.5 中国大陆(CC BY-NC 2.5)15

目录
前言  	 # 

1. 本文目的  	 # 
1. JSON简介  	 # 
2. Python中处理JSON字符串  	 # 

2.1. json中如果内容中包含单引号或双引号如何处理  	 # 
2.2. 字典类型的json字符串中的key一定要用双引号括起来  	 # 
2.3. 字典类型的json字符串中的key要用双引号，而不能用单引号  	 # 
3. C#中处理JSON字符串  	 # 
4. 常见的JSON相关的问题及解决办法  	 # 

4.1. 给JSON添加注释  	 # 
4.2. JSON中的字符串被括起来的，只能是双引号，不能是单引号  	 # 
4.3. JSON中的字符串中不能包含非法字符  	 # 
4.4. JSON中的列表变量内的最后位置，不能有多余的逗号  	 # 
4.5. 要注意JSON字符串的编码  	 # 
参考书目  	 # 

前言

1. 本文目的
本文目的在于详细解释一下JSON方面的知识。

第 1 章 JSON简介
相关旧帖
【整理】什么是JSON+如何处理JSON字符串  1

第 2 章 Python中处理JSON字符串
相关旧帖
【整理】什么是JSON+如何处理JSON字符串  1
【整理】Python中将（字典，列表等）变量格式化成（漂亮的，树形的，带缩进的，JSON方式的）字符串输出  2
【已解决】用BeautifulSoup解析Html格式的Json字符串  3
Python中，有专门的JSON处理模块，名字就叫做：json

2.1. json中如果内容中包含单引号或双引号如何处理
如果json字符串的内容中包含单引号或双引号，直接用json.loads去转换的话，则会导致出错。
解决办法是，把所含的（用双引号括起来的）内容中单引号或双引号前，加上反斜杠即可。
以双引号为例，即，从
”key”:”value incldue “ “
变为
”key”:”value incldue \ ” “

2.2. 字典类型的json字符串中的key一定要用双引号括起来
json字符串是字典变量类型的字符串的时候，对应字典中的key部分，是需要用双引号括起来的，否则json.loads会出错的。
详情参看：【已解决】Python中用json.loads去解析字符串出错：ValueError: Expecting property name: line 1 column 51 (char 51)4

2.3. 字典类型的json字符串中的key要用双引号，而不能用单引号
json字符串是字典变量类型的字符串的时候，对应字典中的key部分，注意是用双引号括起来，而不能是单引号，否则也是会导致json.loads出错的。
比如对于字符串变量timeFillingInfoJson：
{ ’2012’ : { ”month” : [0,0,0,0,0,0,0,-1,-1,-1,-1,-1],”totalCount” : ‘0’} ,’2011’ : { ”month” : [0,0,0,0,0,0,0,0,0,0,0,0],”totalCount” : ‘0’} ,’2010’ : { ”month” : [5,21,22,20,11,7,8,11,12,0,0,1],”totalCount” : ‘118’} ,’2009’ : { ”month” : [0,13,9,20,63,32,35,32,24,39,15,6],”totalCount” : ‘288’} ,’2008’ : { ”month” : [6,40,83,66,35,35,11,5,3,4,0,1],”totalCount” : ‘289’} ,’2007’ : { ”month” : [-1,-1,-1,6,0,19,10,8,3,41,47,44],”totalCount” : ‘178’} } 
用代码：

timeFillingInfoDict = json.loads(timeFillingInfoJson);
logging.info(”timeFillingInfoDict=%s”, timeFillingInfoDict);
    
去解析会出错：
ValueError: Expecting property name: line 1 column 1 (char 1)
而把单引号替换为双引号后：
{ ”2012” : { ”month” : [0,0,0,0,0,0,0,-1,-1,-1,-1,-1],”totalCount” : “0”} ,”2011” : { ”month” : [0,0,0,0,0,0,0,0,0,0,0,0],”totalCount” : “0”} ,”2010” : { ”month” : [5,21,22,20,11,7,8,11,12,0,0,1],”totalCount” : “118”} ,”2009” : { ”month” : [0,13,9,20,63,32,35,32,24,39,15,6],”totalCount” : “288”} ,”2008” : { ”month” : [6,40,83,66,35,35,11,5,3,4,0,1],”totalCount” : “289”} ,”2007” : { ”month” : [-1,-1,-1,6,0,19,10,8,3,41,47,44],”totalCount” : “178”} } 
就可以正常解析，得到对应的dict变量了：
timeFillingInfoDict={ u’2007’: { u’totalCount’: u’178’, u’month’: [-1, -1, -1, 6, 0, 19, 10, 8, 3, 41, 47, 44]} , u’2008’: { u’totalCount’: u’289’, u’month’: [6, 40, 83, 66, 35, 35, 11, 5, 3, 4, 0, 1]} , u’2009’: { u’totalCount’: u’288’, u’month’: [0, 13, 9, 20, 63, 32, 35, 32, 24, 39, 15, 6]} , u’2011’: { u’totalCount’: u’0’, u’month’: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]} , u’2010’: { u’totalCount’: u’118’, u’month’: [5, 21, 22, 20, 11, 7, 8, 11, 12, 0, 0, 1]} , u’2012’: { u’totalCount’: u’0’, u’month’: [0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1]} } 
dict类型json字符串中的key，如果用单引号，是不行的
另外，也去尝试过了，把双引号都替换为单引号：

timeFillingInfoJson = timeFillingInfoJson.replace(’”’, “’”);
timeFillingInfoDict = json.loads(timeFillingInfoJson);
logging.info(”timeFillingInfoDict=%s”, timeFillingInfoDict);
        
结果同样会出错的：
ValueError: Expecting property name: line 1 column 1 (char 1)
所以，看来dict的json字符串中的key，必须是用双引号括起来的，不能少了双引号，也不能是单引号，只能是双引号。

第 3 章 C#中处理JSON字符串
相关旧帖
【已放弃】C#中实现将Json字符串转换为变量  1

第 4 章 常见的JSON相关的问题及解决办法

4.1. 给JSON添加注释
相关旧帖
【部分解决】Json中添加注释  1

4.2. JSON中的字符串被括起来的，只能是双引号，不能是单引号
相关旧帖
【已解决】Python中使用json.loads解码字符串时出错：ValueError: Expecting property name: line 1 column 1 (char 1)  2

4.3. JSON中的字符串中不能包含非法字符
相关旧帖
【已解决】Python中json.loads解析包含\ n的字符串会出错  3

4.4. JSON中的列表变量内的最后位置，不能有多余的逗号
相关旧帖
【已解决】Python中用json.loads解码字符串出错：ValueError: No JSON object could be decoded  4

4.5. 要注意JSON字符串的编码
相关旧帖
【经验记录】Python中json.loads的时候出错->要注意要解码的Json字符的编码  5

参考书目
[1] python初级教程：入门详解1