1

次の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

同じことを単純化できますか?

4

1 に答える 1

2

内部オブジェクトの順序が解析するたびに同じであるとは限りません。そのため、name属性が に設定されたオブジェクトのインデックスを参照するインデックス作成は安全な方法ではありませんSomething

これらすべてのステートメントをネストする代わりに、リスト内包表記ifを使用して回避できます。キーを反復すると、リストのリストが得られ、それぞれに辞書が含まれていることに注意してください。response

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

if次に、オブジェクトの属性に一致する条件をリスト内包表記に追加するnameと、目的のオブジェクトを含む単一のアイテムを含むリストが取得されます。

>>> [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場合は回復力があり、返される必要があります。response

print get_obj_by_name({"error":"some-error"}, 'Something')
# => None
于 2011-10-27T19:00:27.353 に答える