0

「derivatedFrom」というキーを持つJSONメッセージを読む必要があります。その値は次のいずれかの形式になります。

Case 1. "derivedFrom": "id1"

またはこれ:

Case 2. "derivedFrom": ["id1", "id2", "id3"]

私がする必要があるのは、非常に基本的なことです。値を読み取り、それらをループします。今私はこれをやっています:

#line contains JSON string
data = json.loads(line)
# ...
derivedIds = data['derivedFrom']
for deid in derivedIds:
# ...

これはケース2では問題なく機能しますが、ケース1では、ID「id1」の個々の文字をループします。これは明らかに私が必要としているものではありません。

両方のケースを正しく処理するために上記のブロックを変更するにはどうすればよいですか?どうも

4

3 に答える 3

1

派生元の値が常にリストまたは値(つまり、dictではない)になることがわかっている場合:

#line contains JSON string
data = json.loads(line)
# ...
derivedIds = data['derivedFrom']
if not isinstance(derivedIds, list):
    derivedIds = [derivedIds]
for deid in derivedIds:

JSONからのものであるという事実は、心配しなければならないデータ型の数を大幅に制限するため、問題を単純化します。

于 2012-11-21T18:10:59.007 に答える
0

原始的な例として:

#line contains JSON string
data = json.loads(line)
# ...
derivedIds = data['derivedFrom']
if isinstance(derivedIds, basestring):
   #.... 
else:
    for deid in derivedIds:
    # ...
于 2012-11-21T18:18:04.440 に答える
0

属性をstr/unicode持たないという事実で遊ぶことができますが、、、または持っています。__iter__listssetsdicts

#!/usr/bin/env python

import json

case1 = '{"derivedFrom": "id1"}'

case2 = '{"derivedFrom": ["id1", "id2", "id3"]}'

def parse(line):
    data = json.loads(line)
    if not(hasattr(data["derivedFrom"], "__iter__")):
        print "Converting %s to list" % type(data["derivedFrom"])
        data["derivedFrom"] = [data["derivedFrom"]]
    print "data['derivedFrom']: %s, of type %s" % (data["derivedFrom"], type(data["derivedFrom"]))

if __name__ == "__main__":
    parse(case1)
    parse(case2)

ただし、可能であれば、そのJSONを送信しているものを変更して、リストを送信していることを確認したいと思います(送信させようとします'{"derivedFrom": ["id1"]}'

于 2012-11-21T17:59:48.930 に答える