Python for循环json.loads错误字符串索引必须是整数

时间:2015-07-26 16:20:10

标签: python json

我一直在努力理解以下Json解析问题的原因,我已经尝试了很多组合来访问'val'项目值,但是我遇到了一堵砖墙。

我在“类似”的Json样式数据上成功使用了下面的代码,但是我没有把这种方法用于下面的数据的知识。

感谢所有建议。

result = xmltodict.parse(my_read)
result = result['REPORT']['REPORT_BODY']
result =json.dumps(result, indent=1)

    print(result)

    {
 "PAGE": [
     {
      "D-ROW": [
       {
        "@num": "1",
        "type": "wew",
        "val": ".000"
       },
       {
        "@num": "2",
        "type": "wew",
        "val": ".000"
       }
      ]
     },
     {
      "D-ROW": [
       {
        "@num": "26",
        "type": "wew",
        "val": ".000"
       },
       {
        "@num": "27",
        "type": "wew",
        "val": ".000"
       },
       {
        "@num": "28",
        "type": "wew",
        "val": ".000"
    }
   ]
  }
 ]
}

for item in json.loads(json_data):
    print(item['PAGE']['D-ROW']['val']

错误字符串索引必须是整数

4 个答案:

答案 0 :(得分:2)

item['PAGE']包含一个列表,因此您无法使用'D-ROW'对其进行索引。如果您的json加载数据位于变量data中,则可以使用:

for page in data['PAGE']:
    for drow in page['D-ROW']:
        print drow['val']

答案 1 :(得分:2)

首先要注意的是,基于你的JSON结构,它是一个字典{"PAGE": [...], ...},所以当你在它上面使用json.loads()时,你也会得到一个字典

在此for循环中,您的item迭代器实际上是指来自dict的

for item in json.loads(json_data):
    print(item['PAGE']['D-ROW']['val']

这是一个更容易理解的简单例子

>>> for key in json.loads('{"a": "a-value", "b": "b-value"}'):
...     print(key)
...
a
b
  

错误字符串索引必须是整数

因此,您可以猜测在循环中item会引用密钥"PAGE",并且您无法使用['D-ROW']索引该字符串("PAGE"['D-ROW']不会有道理,因此你的错误)

for循环中的键/值

如果您使用以下循环获取项目,item将成为(key, value)的元组

for item in json.loads(json_data).items():
        print(item)

你也可以像这样扩展键值

>>> for key, value in json.loads('{"a": "a-value", "b": "b-value"}').items():
...     print("key is {} value is {}".format(key, value))
...
key is a value is a-value
key is b value is b-value

答案 2 :(得分:1)

您的JSON不应在数字值附近包含引号。例如,更改

"D-ROW": [
   {
    "@num": "1",
    "type": "wew",
    "val": ".000"
   },

"D-ROW": [
   {
    "@num": 1, // Key requires quotes, Value omits quotes if number
    "type": "wew",
    "val": 0.000
   },

答案 3 :(得分:1)

print(item['PAGE']['D-ROW']['val']

D-ROW键包含一个列表,而不是一个字典。

你应该改变

print([_item['val'] for _item in item['PAGE']['D-ROW']])

{{1}}

迭代包含你的词组的列表。