1. 程式人生 > >JSON格式數據的處理

JSON格式數據的處理

obj dede 一律 end log ava image ons 列操作

源文件存儲格式 {"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 import codecs
 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 poi in city_aois: 23 city_aois[poi].sort(key=lambda x: x["hot"],reverse=True) 24
#item=json.dumps(city_aois[poi],ensure_ascii=False) 25 #strs = ‘{"city_name":"‘+poi.encode("UTF-8")+‘","list":‘+item.encode("UTF-8")+‘}‘ 26 #print strs 27 tmp={} 28 tmp[city_name]=poi 29 tmp[list]=city_aois[poi] 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:

https://stackoverflow.com/questions/18337407/saving-utf-8-texts-in-json-dumps-as-utf8-not-as-u-escape-sequence

JSON格式數據的處理