python – SimpleJson处理相同的命名实体
发布时间:2020-12-20 11:21:24 所属栏目:Python 来源:网络整理
导读:我在app引擎中使用Alchemy API,所以我使用simplejson库来解析响应.问题是响应的条目具有sme名称 { "status": "OK","usage": "By accessing AlchemyAPI or using information generated by AlchemyAPI,you are agreeing to be bound by the AlchemyAPI Terms
我在app引擎中使用Alchemy API,所以我使用simplejson库来解析响应.问题是响应的条目具有sme名称
{ "status": "OK","usage": "By accessing AlchemyAPI or using information generated by AlchemyAPI,you are agreeing to be bound by the AlchemyAPI Terms of Use: http://www.alchemyapi.com/company/terms.html","url": "","language": "english","entities": [ { "type": "Person","relevance": "0.33","count": "1","text": "Michael Jordan","disambiguated": { "name": "Michael Jordan","subType": "Athlete","subType": "AwardWinner","subType": "BasketballPlayer","subType": "HallOfFameInductee","subType": "OlympicAthlete","subType": "SportsLeagueAwardWinner","subType": "FilmActor","subType": "TVActor","dbpedia": "http://dbpedia.org/resource/Michael_Jordan","freebase": "http://rdf.freebase.com/ns/guid.9202a8c04000641f8000000000029161","umbel": "http://umbel.org/umbel/ne/wikipedia/Michael_Jordan","opencyc": "http://sw.opencyc.org/concept/Mx4rvViVq5wpEbGdrcN5Y29ycA","yago": "http://mpii.de/yago/resource/Michael_Jordan" } } ] } 所以问题是“子类型”被重复,因此负载返回的字典只是“TVActor”而不是列表.反正有没有绕过这个? 解决方法
定义application / json的
rfc 4627说:
An object is an unordered collection of zero or more name/value pairs 和: The names within an object SHOULD be unique. 这意味着AlchemyAPI不应在同一对象内返回多个“subType”名称,并声称它是JSON. 您可以尝试以XML格式请求相同的内容(outputMode = xml)以避免结果中出现歧义或将重复键值转换为列表: import simplejson as json from collections import defaultdict def multidict(ordered_pairs): """Convert duplicate keys values to lists.""" # read all values into lists d = defaultdict(list) for k,v in ordered_pairs: d[k].append(v) # unpack lists that have only 1 item for k,v in d.items(): if len(v) == 1: d[k] = v[0] return dict(d) print json.JSONDecoder(object_pairs_hook=multidict).decode(text) 例 text = """{ "type": "Person","subType": "AwardWinner" }""" 产量 {u'subType': [u'Athlete',u'AwardWinner'],u'type': u'Person'} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |