Python 3从json获取索引值

时间:2016-08-19 10:32:13

标签: python json python-3.x

我需要通过索引 (不是按键)从json文件 获取值

这是我的json文件

{
    "db": {
        "vendor": {
            "product": {
                "fruits": {
                    "price": {
                        "dollars": [
                            10,
                            2
                        ],
                        "euros": [
                            11,
                            1.9
                        ],
                        "pesos": [
                            16,
                            15
                        ]
                    }
                },
                "vegatables": {
                    "price": {
                        "dollars": {
                            "0": 8,
                            "1": 2
                        },
                        "euros": {
                            "0": 10,
                            "1": 1.5
                        },
                        "pesos": {
                            "0": 15,
                            "1": 12
                        }
                    }
                }
            }
        }
    }
}

我的目标 - 为所有"产品"获得美元,欧元和比索的价值。 (在这个json文件中它只是水果和蔬菜)

我的代码:

import json

path_to_file = "C:\\Users\\admin\\Documents\\kolos\\data\\vegs.json";

with open(path_to_file) as data_file:
    data = json.load(data_file)

lenght_of_products = (len(data["db"]["vendor"]["product"]))

for x in range(lenght_of_back):
print(data["db"]["vendor"]["product"][x]["price"]["dollars"])

我得到了

Traceback (most recent call last):
  File "C:\\Users\\admin\\Documents\\kolos\\data\\vegs.json", line 12, in <module>
    print(data["db"]["vendor"]["product"][x]["price"]["dollars"])
KeyError: 0

问题在于X变量。如果我尝试没有它,例如下面的代码,它就可以工作。

print(data["db"]["vendor"]["product"]["fruits"]["price"]["dollars"][0])

P.S

在我的另一个程序中,我使用类似的代码并且效果很好

   ...
    for x in range(lenght_of_leagues):
        print(data["leagues"][x]["id"])
    ...

2 个答案:

答案 0 :(得分:1)

这是一个应该有效的版本(取决于你期望它做什么):

  • 我将dict()更改为OrderedDict()以保留原始排序

  • 我将.values()添加到正在编入索引的字典中。此方法返回所有字典的列表,然后可以将其编入索引

以下是代码:

import json
from collections import OrderedDict

path_to_file = "test.json";

with open(path_to_file) as data_file:
    data = OrderedDict(json.load(data_file))

length = (len(data["db"]["vendor"]["product"]))

for x in range(length):
    print(data["db"]["vendor"]["product"].values()[x]["price"]["dollars"])

输出是:

{u'1': 2, u'0': 8}
[10, 2]

输出不同的原因是您的fruitsvegetables存储方式不同(一个是列表,另一个是字典)。如果你想以类似的方式迭代它们,你必须使它们相同。

答案 1 :(得分:0)

我认为输入字符串是错误的。

{
    "d": {
        "items": {
             "vegatables": {
                           "spinach": 120,12,23,3445
                           }
                 }
          }
}

JSON格式没有以下输入,必须将其更改为

{
    "d": {
        "items": {
             "vegatables": {
                           "spinach": [120,12,23,3445]
                           }
                 }
          }
}

然后以下命令将正常工作

print(data["d"]["items"]["vegatables"]["spinach"][0])