simplejsonでJSONを正しく解析する方法は?

私は次のJSON文字列を持つことができます:

{ "response" : [ [ { "name" : "LA_",
          "uid" : 123456
        } ],
      [ { "cid" : "1",
          "name" : "Something"
        } ],
      [ { "cid" : 1,
          "name" : "Something-else"
        } ]
    ] }

または次のいずれか:

{"error":"some-error"}

{ "response" : [ [ { "name" : "LA_",
          "uid" : 123456
        } ],
      [ { "cid" : "1",
          "name" : ""
        } ],
      [ { "cid" : 1,
          "name" : "Something-else"
        } ]
    ] }

{ "response" : [ [ { "name" : "LA_",
          "uid" : 123456
        } ] ] }

だから、子どもと要素がすべてあるかどうかはわかりません。 Something の値を取得するには、次の検証を行うだけで十分でしょう:

if jsonstr.get('response'):
    jsonstr = jsonstr.get('response')[1][0]
    if jsonstr:
        name = jsonstr.get('name')
        if jsonstr: # I don't need empty value
            # save in the database

同じことを簡略化することはできますか?

1

1 答え

解析するたびに内部オブジェクトの順序が同じになることは保証されていないので、 name 属性を< code>何か。

if ステートメントをすべて入れ子にするのではなく、リストの理解レスポンスキーを繰り返し実行すると、リストのリストが得られ、それぞれのリストには辞書が含まれていることに注意してください。

>>> data = {"response":[[{"uid":123456,"name":"LA_"}],[{"cid":"1","name":"Something"}],[{"cid":1,"name":"Something-else"}]]}
>>> [lst for lst in data.get('response')]
[[{'name': 'LA_', 'uid': 123456}], [{'name': 'Something', 'cid': '1'}], [{'name': 'Something-else', 'cid': 1}]]

各リスト( lst [0] )の最初の項目にインデックスを付けると、オブジェクトのリストが表示されます。

>>> [lst[0] for lst in data.get('response')]
[{'name': 'LA_', 'uid': 123456}, {'name': 'Something', 'cid': '1'}, {'name': 'Something-else', 'cid': 1}]

オブジェクトの name 属性と一致するようにリストの理解度に if 条件を追加すると、目的のオブジェクトを含む単一項目のリストが得られます。

>>> [lst[0] for lst in data.get('response') if lst[0].get('name') == 'Something']
[{'name': 'Something', 'cid': '1'}]

そして、最終的なリストである最初のアイテムにインデックスを付けることによって、目的のオブジェクトが得られます:

>>> [lst[0] for lst in data.get('response') if lst[0].get('name') == 'Something'][0]
{'name': 'Something', 'cid': '1'}

だからあなたはそれを機能に変えて、あなたの人生を変えることができます:

def get_obj_by_name(data, name):
    objects = [lst[0] for lst in data.get('response', []) if lst[0].get('name') == name]
    if objects:
        return objects[0]

    return None

print get_obj_by_name(data, 'Something')
# => {'name': 'Something', 'cid': '1'}

print get_obj_by_name(data, 'Something')['name']
# => 'Something'

また、レスポンスキーが見つからない場合は復元力があり、 None を返します。

print get_obj_by_name({"error":"some-error"}, 'Something')
# => None
2
追加された
ありがとう、非常に詳細な答えのための@ジャタニズム。実際、「Something」は私が探している価値です。これは他の値でもかまいません。サードパーティ側はこの要素の識別子を私に提供しないので、そのシーケンスに頼らざるを得ません。
追加された 著者 LA_,
どういたしまして。 :)
追加された 著者 jathanism,
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript