4

アプリ エンジンで Alchemy API を使用しているため、simplejson ライブラリを使用して応答を解析しています。問題は、応答に中小企業名を持つエントリがあることです

 {
    "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"
            }
        }
    ]
}

したがって、問題は「subType」が繰り返されるため、ロードが返す辞書がリストではなく「TVActor」になることです。とにかくこれを回避する方法はありますか?

4

2 に答える 2

6

定義するrfc 4627application/jsonは次のように述べています。

An object is an unordered collection of zero or more name/value pairs

と:

The names within an object SHOULD be unique.

これは、AlchemyAPI が"subType"同じオブジェクト内で複数の名前を返してはならず、それが JSON であると主張してはならないことを意味します。

outputMode=xml結果のあいまいさを避けるため、または重複するキー値をリストに変換するために、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": "Athlete",
  "subType": "AwardWinner"
}"""

出力

{u'subType': [u'Athlete', u'AwardWinner'], u'type': u'Person'}
于 2011-10-19T21:51:31.510 に答える