一个json两种编码,怎么json loads dumps

1055人阅读
网页信息提取
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &&json数据的中文显示问题 python
& & & &post请求数据时,响应的内容是json数据,但是返回的json数据中文显示有问题,变成 &\uXXX的形式。这是因为中文以 unicode 编码了,而默认是以ASCII解析的,中文不在ASCII编码中,所以无法显示。这时候我们可以用 import json 然后调用json.loads() 和json.dumps()来使中文正确显示。
& & & 具体怎么做呢?用下面的代码即可实现(data是中文不能正常显示的json串,newjson是处理后中文正常显示的字符串)
import json
myjson=json.loads(data) #data是向 api请求的响应数据,data必须是字符串类型的
newjson=json.dumps(myjson,ensure_ascii=False)
#ensure_ascii=False 就不会用 ASCII 编码,中文就可以正常显示了
print(newjson)
& & &首先需要了解一下encoding与decoding
& & &encoding:编码,把Python对象转换成json字符串
& & &decoding:解码,把json字符串解码转换成Python对象
1. &json.loads() &:把json字符串解码转换成Python对象
& &从上图可以看到 &json.loads()的参数说明。注意这里的“s”应该是 &一个包含JSON 文档的“str”实例(也就是上面说的 data应该是字符串)
2.json.dumps(): &把Python对象转换成json字符串
&从上图可以看到 &json.loads()的参数说明。注意这里的&obj&应该是Python对象,参数“ensure_ascii”默认值是True(这就是为什么中文无法正常显示的原因),所以我们要把这个参数的值设为False.
下面是我的代码:(我用的是python3.4)
import jsonimport urllib.requestreq = urllib.request.Request(url,postData,header)
# 把url,postData,header换成你自已的值
response=urllib .request .urlopen(req)
#response是file-like的对象
data=response.read()
#data是bytes 类型
data = ungzip(data)
#ungzip是我自己写的解压函数
data=data.decode()
#decode后,data从bytes类型转换成str
#处理data的中文
myjson=json.loads(data)
#data的type必须为str.
newjson=json.dumps(myjson,ensure_ascii=False)print(newjson)
附上Python中的json处理的官方文档:https://docs.python.org/3.4/library/json.html
以及有用的链接:/kf/129.html
另外:你可以通过help(json.dumps)查看这个函数的有关参数信息
通过 help(json.loads) 查看该函数的参数信息:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:53090次
积分:1370
积分:1370
排名:千里之外
原创:85篇
转载:33篇
(1)(12)(10)(13)(8)(3)(12)(6)(4)(5)(3)(11)(1)(4)(4)(5)(12)(3)(1)【已解决】Python中用json.loads解码字符串出错:ValueError: No JSON object could be decoded - 推酷
【已解决】Python中用json.loads解码字符串出错:ValueError: No JSON object could be decoded
的过程中,结果又出错:
LINE 106& : INFO&&&& photoInfoJson={id:’29678′,owner:’379879′,ownername:’shanshu’,title:’IMG_3464′,description:”,bucket:’shanshu’,key:’CsFzMuHz’,license:0,stats_notes: 0,albums: ['
1880',],tags:[{name:'', author: '379879'},{name:'澶╁钩灞辫祻绾㈡灚', author: '379879'}],owner:{id: 379879,username: ‘shanshu’,nickname: ‘shanshu’}}
LINE 110& : INFO&&&& photoInfoJsonAddQuote={‘id’:’29678′,’owner’:’379879′,’ownername’:'shanshu’,'title’:'IMG_3464′,’description’:”,’bucket’:'shanshu’,'key’:'CsFzMuHz’,'license’:0,’stats_not
es’: 0,’albums’: ['880',],’tags’:[{'name':'', 'author': '379879'},{'name':'澶╁钩灞辫祻绾㈡灚', 'author': '379879'}],’owner’:{‘id’: 379879,’username’: ‘shanshu’,'nickname’: ‘shanshu’
LINE 112& : INFO&&&& photoInfoJsonDoubleQuote={&id&:&29678&,&owner&:&379879&,&ownername&:&shanshu&,&title&:&IMG_3464&,&description&:&&,&bucket&:&shanshu&,&key&:&CsFzMuHz&,&license&:0,&stats_
notes&: 0,&albums&: [&880&,],&tags&:[{&name&:&&, &author&: &379879&},{&name&:&澶╁钩灞辫祻绾㈡灚&, &author&: &379879&}],&owner&:{&id&: 379879,&username&: &shanshu&,&nickname&: &shans
photoInfoDict = json.loads(photoInfoJsonDoubleQuote);
File &D:\tmp\dev_install_root\Python27_x64\lib\json\__init__.py&, line 326, in loads
return _default_decoder.decode(s)
File &D:\tmp\dev_install_root\Python27_x64\lib\json\decoder.py&, line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File &D:\tmp\dev_install_root\Python27_x64\lib\json\decoder.py&, line 384, in raw_decode
raise ValueError(&No JSON object could be decoded&)
ValueError: No JSON object could be decoded
【解决过程】
1.参考自己的帖子:
去添加编码参数试试:
photoInfoJsonAddQuote = re.sub(r&(,?)(\w+?)\s*?:&, r&\1'\2':&, photoInfoJson);
(&photoInfoJsonAddQuote=%s&, photoInfoJsonAddQuote);
photoInfoJsonDoubleQuote = photoInfoJsonAddQuote.replace(&'&, &\&&);
(&photoInfoJsonDoubleQuote=%s&, photoInfoJsonDoubleQuote);
#photoInfoJsonDoubleQuote = photoInfoJson.replace(&'&, '&');
#(&photoInfoJsonDoubleQuote=%s&, photoInfoJsonDoubleQuote);
#photoInfoDict = json.loads(photoInfoJsonDoubleQuote);
photoInfoDict = json.loads(photoInfoJsonDoubleQuote, &UTF-8&);
#photoInfoDict = json.loads(photoInfoJsonDoubleQuote);
(&photoInfoDict=%s&, photoInfoDict);
结果是问题依旧。
虽然知道原因,此处json库不支持带BOM的UTF-8,但是此处是获得的字符串photoInfoJson,
所以,没法通过notepad++等去转换文件为不带BOM的UTF-8。
所以,需要重新想办法。
2.结果手动重新解码和编码:
photoInfoJsonAddQuote = re.sub(r&(,?)(\w+?)\s*?:&, r&\1'\2':&, photoInfoJson);
(&photoInfoJsonAddQuote=%s&, photoInfoJsonAddQuote);
photoInfoJsonDoubleQuote = photoInfoJsonAddQuote.replace(&'&, &\&&);
(&photoInfoJsonDoubleQuote=%s&, photoInfoJsonDoubleQuote);
photoInfoJsonDoubleQuoteUni = photoInfoJsonDoubleQuote.decode(&UTF-8&);
photoInfoJsonDoubleQuoteUtf8 = photoInfoJsonDoubleQuoteUni.encode(&UTF-8&);
#photoInfoJsonDoubleQuote = photoInfoJson.replace(&'&, '&');
#(&photoInfoJsonDoubleQuote=%s&, photoInfoJsonDoubleQuote);
#photoInfoDict = json.loads(photoInfoJsonDoubleQuote, &UTF-8&);
#photoInfoDict = json.loads(photoInfoJsonDoubleQuote);
photoInfoDict = json.loads(photoInfoJsonDoubleQuoteUtf8);
(&photoInfoDict=%s&, photoInfoDict);
ValueError: No JSON object could be decoded
3.结果去用代码测试了下,当前的确本身就是UTF-8的字符串:
print &type(photoInfoJson)=&,type(photoInfoJson); #type(photoInfoJson)= &type 'str'&
print crifanLib.getStrPossibleCharset(photoInfoJson); #utf-8
但是不知道为何无法解码。
4.直接试试,单引号:
photoInfoJsonAddQuote = re.sub(r&(,?)(\w+?)\s*?:&, r&\1'\2':&, photoInfoJson);
(&photoInfoJsonAddQuote=%s&, photoInfoJsonAddQuote);
#photoInfoJsonDoubleQuote = photoInfoJsonAddQuote.replace(&'&, &\&&);
#(&photoInfoJsonDoubleQuote=%s&, photoInfoJsonDoubleQuote);
#photoInfoJsonDoubleQuoteUni = photoInfoJsonDoubleQuote.decode(&UTF-8&);
#photoInfoJsonDoubleQuoteUtf8 = photoInfoJsonDoubleQuoteUni.encode(&UTF-8&);
#photoInfoJsonDoubleQuote = photoInfoJson.replace(&'&, '&');
#(&photoInfoJsonDoubleQuote=%s&, photoInfoJsonDoubleQuote);
#photoInfoDict = json.loads(photoInfoJsonDoubleQuote, &UTF-8&);
#photoInfoDict = json.loads(photoInfoJsonDoubleQuote);
photoInfoDict = json.loads(photoInfoJsonAddQuote);
(&photoInfoDict=%s&, photoInfoDict);
看看效果,你的确会出现:
ValueError: Expecting property name: line 1 column 1 (char 1)
5.仍旧再参考:
去试试,把其转换为ANSI的GB18030,:
photoInfoJsonAddQuote = re.sub(r&(,?)(\w+?)\s*?:&, r&\1'\2':&, photoInfoJson);
(&photoInfoJsonAddQuote=%s&, photoInfoJsonAddQuote);
photoInfoJsonDoubleQuote = photoInfoJsonAddQuote.replace(&'&, &\&&);
(&photoInfoJsonDoubleQuote=%s&, photoInfoJsonDoubleQuote);
photoInfoJsonDoubleQuoteUni = photoInfoJsonDoubleQuote.decode(&UTF-8&);
photoInfoJsonAddQuoteAnsi = photoInfoJsonDoubleQuoteUni.encode(&GB18030&);
print &type(photoInfoJson)=&,type(photoInfoJsonAddQuoteAnsi);
print crifanLib.getStrPossibleCharset(photoInfoJsonAddQuoteAnsi);
#photoInfoJsonDoubleQuote = photoInfoJson.replace(&'&, '&');
#(&photoInfoJsonDoubleQuote=%s&, photoInfoJsonDoubleQuote);
#photoInfoDict = json.loads(photoInfoJsonDoubleQuote, &UTF-8&);
#photoInfoDict = json.loads(photoInfoJsonDoubleQuote);
photoInfoDict = json.loads(photoInfoJsonAddQuoteAnsi);
(&photoInfoDict=%s&, photoInfoDict);
结果问题依旧。
6.参考手册的解释:
object_hook
parse_float
parse_constant
object_pairs_hook
Deserialize
instance containing a JSON document) to a Python object.
instance and is encoded with an ASCII based encoding other than UTF-8 (e.g. latin-1), then an appropriate
name must be specified. Encodings that are not ASCII based (such as UCS-2) are not allowed and should be decoded to
The other arguments have the same meaning as in
去改为unicode试试:
photoInfoJsonAddQuote = re.sub(r&(,?)(\w+?)\s*?:&, r&\1'\2':&, photoInfoJson);
(&photoInfoJsonAddQuote=%s&, photoInfoJsonAddQuote);
photoInfoJsonDoubleQuote = photoInfoJsonAddQuote.replace(&'&, &\&&);
(&photoInfoJsonDoubleQuote=%s&, photoInfoJsonDoubleQuote);
photoInfoJsonDoubleQuoteUni = photoInfoJsonDoubleQuote.decode(&UTF-8&);
#photoInfoJsonAddQuoteAnsi = photoInfoJsonDoubleQuoteUni.encode(&GB18030&);
print &type(photoInfoJson)=&,type(photoInfoJsonDoubleQuoteUni);
#print crifanLib.getStrPossibleCharset(photoInfoJsonDoubleQuoteUni);
#photoInfoJsonDoubleQuote = photoInfoJson.replace(&'&, '&');
#(&photoInfoJsonDoubleQuote=%s&, photoInfoJsonDoubleQuote);
#photoInfoDict = json.loads(photoInfoJsonDoubleQuote, &UTF-8&);
#photoInfoDict = json.loads(photoInfoJsonDoubleQuote);
#photoInfoDict = json.loads(photoInfoJsonAddQuoteAnsi);
photoInfoDict = json.loads(photoInfoJsonDoubleQuoteUni);
(&photoInfoDict=%s&, photoInfoDict);
结果是问题依据。
7.再去试试,使用GB18030的看看是否能解码:
photoInfoJsonAddQuote = re.sub(r&(,?)(\w+?)\s*?:&, r&\1'\2':&, photoInfoJson);
(&photoInfoJsonAddQuote=%s&, photoInfoJsonAddQuote);
photoInfoJsonDoubleQuote = photoInfoJsonAddQuote.replace(&'&, &\&&);
(&photoInfoJsonDoubleQuote=%s&, photoInfoJsonDoubleQuote);
photoInfoJsonDoubleQuoteUni = photoInfoJsonDoubleQuote.decode(&UTF-8&);
photoInfoJsonAddQuoteAnsi = photoInfoJsonDoubleQuoteUni.encode(&GB18030&);
#print &type(photoInfoJson)=&,type(photoInfoJsonDoubleQuoteUni);
#print crifanLib.getStrPossibleCharset(photoInfoJsonDoubleQuoteUni);
#photoInfoJsonDoubleQuote = photoInfoJson.replace(&'&, '&');
#(&photoInfoJsonDoubleQuote=%s&, photoInfoJsonDoubleQuote);
#photoInfoDict = json.loads(photoInfoJsonDoubleQuote, &UTF-8&);
#photoInfoDict = json.loads(photoInfoJsonDoubleQuote);
photoInfoDict = json.loads(photoInfoJsonAddQuoteAnsi, &GB18030&);
#photoInfoDict = json.loads(photoInfoJsonDoubleQuoteUni);
(&photoInfoDict=%s&, photoInfoDict);
结果是问题依旧。
8.单独,写上原始字符串,看看能否正确解码:
#debug here write fix string json to test
photoInfoJson = &&&{id:'29678',owner:'379879',ownername:'shanshu',title:'IMG_3464',description:'',bucket:'shanshu',key:'CsFzMuHz',license:0,stats_notes: 0,albums: ['
1880',],tags:[{name:'', author: '379879'},{name:'天平山赏红枫', author: '379879'}],owner:{id: 379879,username: 'shanshu',nickname: 'shanshu'}}&&&;
photoInfoJsonAddQuote = re.sub(r&(,?)(\w+?)\s*?:&, r&\1'\2':&, photoInfoJson);
(&photoInfoJsonAddQuote=%s&, photoInfoJsonAddQuote);
photoInfoJsonDoubleQuote = photoInfoJsonAddQuote.replace(&'&, &\&&);
(&photoInfoJsonDoubleQuote=%s&, photoInfoJsonDoubleQuote);
#photoInfoJsonDoubleQuoteUni = photoInfoJsonDoubleQuote.decode(&UTF-8&);
#photoInfoJsonAddQuoteAnsi = photoInfoJsonDoubleQuoteUni.encode(&GB18030&);
#print &type(photoInfoJson)=&,type(photoInfoJsonDoubleQuoteUni);
#print crifanLib.getStrPossibleCharset(photoInfoJsonDoubleQuoteUni);
#photoInfoJsonDoubleQuote = photoInfoJson.replace(&'&, '&');
#(&photoInfoJsonDoubleQuote=%s&, photoInfoJsonDoubleQuote);
#photoInfoDict = json.loads(photoInfoJsonDoubleQuote, &UTF-8&);
#photoInfoDict = json.loads(photoInfoJsonDoubleQuote);
#photoInfoDict = json.loads(photoInfoJsonAddQuoteAnsi, &GB18030&);
photoInfoDict = json.loads(photoInfoJsonDoubleQuote);
(&photoInfoDict=%s&, photoInfoDict);
结果却又是其他错误:
&&& photoInfoDict = json.loads(photoInfoJsonDoubleQuote);
& File &D:\tmp\dev_install_root\Python27_x64\lib\json\__init__.py&, line 326, in loads
&&& return _default_decoder.decode(s)
& File &D:\tmp\dev_install_root\Python27_x64\lib\json\decoder.py&, line 366, in decode
&&& obj, end = self.raw_decode(s, idx=_w(s, 0).end())
& File &D:\tmp\dev_install_root\Python27_x64\lib\json\decoder.py&, line 382, in raw_decode
&&& obj, end = self.scan_once(s, idx)
ValueError: Invalid control character at: line 1 column 195 (char 195)
其看看195是哪个字符。
结果看到,其中有CR LF:
9.然后去把CR LF去掉:
然后再去运行试试,结果问题依旧。
10.把测试代码变为:
photoInfoJson = &&&{id:'29678',owner:'379879',ownername:'shanshu',title:'IMG_3464',description:'xxx',bucket:'shanshu',key:'CsFzMuHz',license:0,stats_notes: 0,albums: ['880',],tags:[{name:'', author: '379879'},{name:'天平山赏红枫', author: '379879'}],owner:{id: 379879,username: 'shanshu',nickname: 'shanshu'}}&&&;
结果问题依旧。
11.结果把代码改为:
#debug here write fix string json to test
photoInfoJson = &&&{id:'29678',owner:'379879',ownername:'shanshu',title:'IMG_3464',description:'xxx',bucket:'shanshu',key:'CsFzMuHz',license:0,stats_notes: 0,albums: ['880'],tags:[{name:'', author: '379879'},{name:'天平山赏红枫', author: '379879'}],owner:{id: 379879,username: 'shanshu',nickname: 'shanshu'}}&&&;
photoInfoJsonAddQuote = re.sub(r&(,?)(\w+?)\s*?:&, r&\1'\2':&, photoInfoJson);
(&photoInfoJsonAddQuote=%s&, photoInfoJsonAddQuote);
photoInfoJsonDoubleQuote = photoInfoJsonAddQuote.replace(&'&, &\&&);
(&photoInfoJsonDoubleQuote=%s&, photoInfoJsonDoubleQuote);
#photoInfoJsonDoubleQuoteUni = photoInfoJsonDoubleQuote.decode(&UTF-8&);
#photoInfoJsonAddQuoteAnsi = photoInfoJsonDoubleQuoteUni.encode(&GB18030&);
#print &type(photoInfoJson)=&,type(photoInfoJsonDoubleQuoteUni);
#print crifanLib.getStrPossibleCharset(photoInfoJsonDoubleQuoteUni);
#photoInfoJsonDoubleQuote = photoInfoJson.replace(&'&, '&');
#(&photoInfoJsonDoubleQuote=%s&, photoInfoJsonDoubleQuote);
#photoInfoDict = json.loads(photoInfoJsonDoubleQuote, &UTF-8&);
#photoInfoDict = json.loads(photoInfoJsonDoubleQuote);
#photoInfoDict = json.loads(photoInfoJsonAddQuoteAnsi, &GB18030&);
photoInfoDict = json.loads(photoInfoJsonDoubleQuote);
(&photoInfoDict=%s&, photoInfoDict);
竟然,终于,可以解码了。。。
其中,是把:
albums: ['880'
albums: ['880']
即,把列表类型的值的内部的最后一个“多余”的逗号去掉,就可以了。
对于列表最后,添加上一个逗号,对于本身Python中的语法,是允许的;
对于其他语言,比如C语言,记得也是允许的。
但是很变态的是,在Python 2.7.3中的json库中,是不支持的。。。
导致,很多人,如果遇到类似问题,根本无从下手。。。
在Python 2.7.3中的json库中,是不支持的这种的:
albums: ['880'
必须写成:
albums: ['880']
解决办法:
对于上述这种非法的字符串:
{id:’29678′,owner:’379879′,ownername:’shanshu’,title:’IMG_3464′,description:’xxx’,bucket:’shanshu’,key:’CsFzMuHz’,license:0,stats_notes: 0,albums: ['880'
],tags:[{name:'', author: '379879'},{name:'天平山赏红枫', author: '379879'}],owner:{id: 379879,username: ‘shanshu’,nickname: ‘shanshu’}}
addedSingleQuoteJsonStr = re.sub(r&(,?)(\w+?)\s*?:&, r&\1'\2':&, orginalJsonStr);
doubleQuotedJsonStr = addedSingleQuoteJsonStr.replace(&'&, &\&&);
#remove comma before end of list
removedLastCommaInList = re.sub(r&,\s*?]&, &]&, addedSingleQuoteJsonStr);
处理成,合法的:
{id:’29678′,owner:’379879′,ownername:’shanshu’,title:’IMG_3464′,description:’xxx’,bucket:’shanshu’,key:’CsFzMuHz’,license:0,stats_notes: 0,albums: ['880'],tags:[{name:'', author: '379879'},{name:'天平山赏红枫', author: '379879'}],owner:{id: 379879,username: ‘shanshu’,nickname: ‘shanshu’}}
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致Python中解析JSON并同时进行自定义编码处理实例_python_ThinkSAAS
Python中解析JSON并同时进行自定义编码处理实例
Python中解析JSON并同时进行自定义编码处理实例
内容来源: 网络
在对文件内容或字符串进行JSON反序列化(deserialize)时,由于原始内容编码问题,可能需要对反序列化后的内容进行编码处理(如将unicode对象转换为str)。
在Python中,一种方式是先使用json.load或json.loads反序列化得到dict对象,然后对这个dict对象进行编码处理。
但其实在json.load与json.loads中,有可选参数object_hook。通过使用此参数,可以对反序列化得到的dict直接进行处理,并使用处理后新的dict替代原dict返回。
使用方法为:
d = json.loads(json_str, object_hook=_decode_dict)
附Shadowsocks中使用的_decode_dict与_decode_list:
def _decode_list(data):
for item in data:
if isinstance(item, unicode):
item = item.encode('utf-8')
elif isinstance(item, list):
item = _decode_list(item)
elif isinstance(item, dict):
item = _decode_dict(item)
rv.append(item)
def _decode_dict(data):
for key, value in data.iteritems():
if isinstance(key, unicode):
key = key.encode('utf-8')
if isinstance(value, unicode):
value = value.encode('utf-8')
elif isinstance(value, list):
value = _decode_list(value)
elif isinstance(value, dict):
value = _decode_dict(value)
rv[key] = value
1.https://docs.python.org/2/library/json.html
2./clowwindy/shadowsocks/blob/master/shadowsocks/utils.py
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信8749人阅读
python学习(15)
python学习之7 JSON编码
JSON是什么?
常用于网络数据的交换。下面是百度来的:
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
key - value 对应的,和python中的字典比较类似。
如,{“1”:”liu”,”2”:”yun”,”3”:”fei”}
3-&fei ,共三组数据
import json
python格式转成json编码,使用dumps
json编码转成python格式,使用loads
import json
my = {"1": "liu", "2": "yun", "3": "fei"}
json_encode = json.dumps(my)
print(type(json_encode))
decode_json = json.loads(json_encode)
print(type(decode_json))
class ‘str’
class ‘dict’
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:288859次
积分:3290
积分:3290
排名:第8328名
原创:38篇
文章:11篇
阅读:94153
(2)(7)(7)(17)(4)(1)(2)(1)

我要回帖

更多关于 json loads dumps 的文章

 

随机推荐