使用Python获取特定JSON值的更可靠方法

时间:2015-01-26 17:27:22

标签: python json

根据this Q&A,可以使用print data[u'X'][50][u'Z']

找到某个JSON值

data[u'X']导致:

{
  "X" : [ {
    "A" : "B",
    ...
  }, {
    ...
  }, {
    "C" : "D",
  } ]
}

应用整数方法意味着用逗号分隔的每个部分,例如"element" : [ { "name" : "value", ... },需要计算,直到找到所需的部分,在这种情况下为50。

如果将来更改JSON结构会怎样?这是否意味着每次都应该更新整数?

在我看来,这种方法很脆弱。如何使其更可靠?

尝试

print data[u'X'][0]导致:

{u'A': u'B', u'C': u'D'}

,而

print data[u'X'][u'A']

结果:

Traceback (most recent call last):
  File "test.py", line 9, in <module>
    print data[u'beans'][u'modelerType']
TypeError: list indices must be integers, not unicode

2 个答案:

答案 0 :(得分:2)

JSON中有两种类型的集合,数组和对象(see the API for more info)

例如,项目列表:

x = ['a', 'b', 'c', 'd']
x[2] // Returns 'c'

一个对象:

x = {"a": 10, "b": 20, "c": 30}
x['b'] // Returns 20

因此,假设您使用对象来存储数据,而根本不需要索引号,只需要使用属性的名称。如果使用列表,则必须存储列表索引。

可以将数组存储在对象中,反之亦然。例如:

x = [1, 2, 3, {"a": 10, "b": 20, "c": [30, 40, 50]}]
x[0] // Returns 1
x[3] // Returns {"a": 10, "b": 20, "c": [30, 40, 50]}
x[3]['a'] // Returns 10
x[3]['c'][2] // Returns 50

答案 1 :(得分:0)

这可能更接近你正在寻找的东西:

models = ['JvmMetrics', 'MyMetrics']
filtered = filter(ldata['beans'], lambda x: x['modelerType'] in models)

除非你想从JMX响应中构建另一个dict,否则不太可能有更好的方法。