JSON格式数据的处理
Posted 我是一个粉刷匠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSON格式数据的处理相关的知识,希望对你有一定的参考价值。
源文件存储格式 {"coi_id":"dhfjhjhfjdhfjdhjs", "city_name":"深圳市", "coi_name":"海岸城", "img":"http://......jpg", "list":[{.......}], "hot":3.5},源文件JSON形式按行存储。
目标:删除“list”属性及相关值,将相同城市名的的购物中心划在一起,最后存储为 {"city_name":"深圳市", "list":[{"coi_is":"dfgffgf", "coi_name":"海岸城", "img":"http://...jpg", "hot":3.5}, {...}, ...] }形式,并对每个城市下的购物中心的热度hot按值大小排序。
实现:
1 import json 2 3 4 fileread=open("test.data") 5 filenew=open("aois.txt",\'w+\') 6 7 city_aois={} 8 city_put={} 9 10 for line in fileread: 11 #print line 12 json_obj=json.loads(line) 13 del json_obj["list"] 14 #print json_obj 15 if json_obj[\'city_name\'] not in city_aois: 16 city_aois[json_obj[\'city_name\']]=[] 17 city_aois[json_obj[\'city_name\']].append(json_obj) 18 else: 19 city_aois[json_obj[\'city_name\']].append(json_obj) 20 21 22 for p in city_aois: 23 city_aois[p].sort(key=lambda x: x["hot"],reverse=True) 24 #item=json.dumps(city_aois[p],ensure_ascii=False) 25 #strs = \'{"city_name":"\'+p.encode("UTF-8")+\'","list":\'+item.encode("UTF-8")+\'}\' 26 #print strs 27 tmp={} 28 tmp[\'city_name\']=p 29 tmp[\'list\']=city_aois[p] 30 strs=json.dumps(tmp,ensure_ascii=False).encode("UTF-8") 31 filenew.write(strs+\'\\r\\n\') 32 33 fileread.close() 34 filenew.close()
踩过的坑:
1. 对python不熟,其实“JSON”并不是java中使用的是一个对象,仅仅是JSON格式的字符串,通过json.loads()是将读取文件的字符串转换为“字典”形式,类型为 “dict”,然后就可以对字典进行相应的操作了,譬如根据key获得value这样的形式。
2. python将JSON格式的字符串转为字典时,此时是unicode编码,一系列操作完毕后,需要通过json.dumps()将字典转换为字符串,这时候会出现各种编码问题,譬如简单dumps后中文显示的是unicode形式,如果字典里有中文,则需要加上
json.dumps(tmp,ensure_ascii=False)
打印显示时,还需调用encode将编码转换为UTF-8形式。
3. 会出现错误“UnicodeDecodeError: \'ascii\' codec can\'t decode byte 0xe6 in position 1: ordinal not in range(128)”
是因为“key和value不能以混合普通字符串和unicode字符串的形式存在”.
此外,
item=json.dumps(city_aois[poi],ensure_ascii=False) tmp[\'list\']=item.encode("UTF-8") strs=json.dumps(tmp,ensure_ascii=False).encode("UTF-8")
print strs
如上做法就是先将 dict转换为字符串复制给了tmp的“list”, 然后dumps时就不会以字典的规矩馆list中的内容,一律以字符串对待,则会出现:
所以在dumps前,list中的内容也要是字典形式。最后统一dumps。
注意使用过程中,编码一致性。
参考了以下博客内容:
json.dumps使用的坑以及字符编码:
http://www.cnblogs.com/stubborn412/p/3818423.html
在线查看 不同编码内容对应的汉字:
http://tool.oschina.net/encode?type=3
python字典与文件读写:
http://blog.csdn.net/frankchen0130/article/details/53136681
json.dumps编码 utf8与unicode:
以上是关于JSON格式数据的处理的主要内容,如果未能解决你的问题,请参考以下文章
golang的xorm如何将[]map[string][]byte 格式的数据序列化成json输出
Spring注解处理Ajax请求-JSON格式[系统架构:Spring+SpringMVC+MyBatis+MySql]