使用python - 在解析的JSON中仅从key:value对中获取特定值

时间:2016-11-29 12:05:39

标签: python json python-2.7

我正在尝试从JSON文件中提取特定数据。这是我的代码。

jsonurl = http://localhost:8080/test.json
a = urllib2.urlopen(jsonurl).read()
b = json.loads(a)
    for x, y in b.iteritems():
        print x, y

这是我的json

{
"abc": [
    "build=1.0.44.0", 
    "proxy=none"
], 
"xyz": [
     "proxy=https",
     "build=1.0.127.0"
], 
"alfa": [
    "build=1.0.118.0", 
    "proxy=none"
], 
"beta": [
    "proxy=http"
    "build=1.0.20.0" 
 ]
}

我从json获取所有键和值,但我只需要提取键:(build =)的值。 我想要的输出是 ABC:1.0.44.0 xyz:1.0.127.0 ....等我尝试了很多选项,但无法得到理想的结果。

3 个答案:

答案 0 :(得分:1)

jsonurl = http://localhost:8080/test.json
a = urllib2.urlopen(jsonurl).read()
b = json.loads(a)
for x, y in b.iteritems():
    print x, y

打印字典中的每个键/值。您的每个值实际上都是一个列表,因此要访问列表项,您需要使用正确的语法。

for x, y in b.iteritems():
    print x, y, y[0]

将显示您的键,值和值[0]。

现在,确定列表中的哪个元素包含build=字符串:

> my_list = ["proxy=https", "build=1.0.127.0"]
> build_str = [i for i in my_list if 'build=' in i][0]
> build_str
build=1.0.127.0

从那里,你可以改进你的程序来解析字符串。要按照您的要求解析字符串,我通常会寻找一个简单的“分裂”字符串。分隔符。在这种情况下,=脱颖而出。拆分将采用一个字符串并在每个分隔符处创建一个包含中断的列表。

> my_str_as_a_list = "build=1.0.20.0".split('=')
> my_str_as_a_list
['build', '1.0.20.0']
> my_str_as_a_list[1]
1.0.20.0

现在,将此概念应用于for循环:

for key, value in b.iteritems():
    my_str = [i for i in value if 'build=' in i][0]
    v = my_str.split('=')[1]
    print '{}:{}'.format(key, v)

我不确定您是否希望根据您的问题以字典/字符串/列表的形式输出,但您应该能够轻松地使用提供的答案到达那里。

答案 1 :(得分:0)

只需迭代并保持其值匹配的键

output_keys = [key for key, value in myjsons if value[0] == 'build=.....']

没有迭代就没有快速的方法,因为字典用于查找键,而不是值

答案 2 :(得分:0)

尝试如下:

data = {
    "abc": [
        "build=1.0.44.0", 
        "proxy=none"
    ],
    "xyz": [
        "build=1.0.127.0", 
        "proxy=https"
    ], 
    "alfa": [
        "build=1.0.118.0", 
        "proxy=none"
    ], 
    "beta": [
        "build=1.0.20.0", 
        "proxy=http"
    ]
}

res = {}
for k,v in data.items():
    res[k] = v[0].split('=')[1] if 'build=' in v[0] else v[1].split('=')[1]

或使用词典理解:

res = {k: v[0].split('=')[1] if 'build=' in v[0] else v[1].split('=')[1] for k,v in data.items()}

<强>输出:

>>> res
{'xyz': '1.0.127.0', 'abc': '1.0.44.0', 'alfa': '1.0.118.0', 'beta': '1.0.20.0'}