Python:解析JSON时获取Keyerror

时间:2015-10-17 15:49:10

标签: python json string parsing

我刚刚制作了一个程序来解析api中的一些数据。 api以JSON格式返回数据。当我尝试解析它时,它给了我一个关键错误

Traceback (most recent call last):
  File "test.py", line 20, in <module>
    print(parsed_json['plain'])
KeyError: 'plain'

这是重要的代码部分(其余部分仅用于制作网址,完美无缺)

response = urllib.request.urlopen(url2).read()
strr = str(response)


if "plain" in strr:
    parsed_json = json.loads(response.decode("UTF-8"))
    print(parsed_json['plain'])
elif "INVALID HASH" in strr:
    print("You have entered an invalid hash.")
elif "NOT FOUND" in strr:
    print("The hash is not found")
elif "LIMIT REACHED" in strr:
    print("You have reached the max requests per minute, please try again in one minute.")

我正在尝试在普通字段中获取数据。 以下是API的输出:

{
  "REQUEST": "FOUND",
  "739c5b1cd5681e668f689aa66bcc254c": {
    "plain": "test",
    "hexplain": "74657374",
    "algorithm": "MD5X5PLAIN"
  }
}

2 个答案:

答案 0 :(得分:2)

当你可以看到你试图在其中定位数据的JSON对象的嵌套结构时,更容易看到发生了什么:

工作示例#1 - 使用Python 2.6.9 2.7.10 3.3.5 进行测试和 3.5.0

import json

json_string = '''
{
    "REQUEST": "FOUND",
    "739c5b1cd5681e668f689aa66bcc254c": {
        "plain": "test",
        "hexplain": "74657374",
        "algorithm": "MD5X5PLAIN"
    }
}
'''

if 'plain' in json_string:
    parsed_json = json.loads(json_string)
    print(parsed_json['739c5b1cd5681e668f689aa66bcc254c']['plain'])

&#39;滑动&#39;是&#39; 739c5b1cd5681e668f689aa66bcc254c&#39;

的孩子


修改

以下示例循环遍历parsed_json并检查每个密钥的长度为32个字符,并检查密钥的子值是否为&#39; plain&#39;在里面。

工作示例#2 - 使用Python 2.6.9 2.7.10 3.3.5 进行测试和 3.5.0

import json
import re

def is_MD5(s):
    return True if re.match(r"([a-f\d]{32})", key) else False

strr = '''
{
    "REQUEST": "FOUND",
    "739c5b1cd5681e668f689aa66bcc254c": {
        "plain": "test",
        "hexplain": "74657374",
        "algorithm": "MD5X5PLAIN"
    }
}
'''

parsed_json = json.loads(strr)

for key, value in parsed_json.items():
    if is_MD5(key) and 'plain' in parsed_json[key]:
        xHash = key
        xPlain = parsed_json[key]['plain']

        print('value in key "plain" in key "{0}" is "{1}"'.format(*[xHash,
                                                                    xPlain]))

<强>输出

the value of key "plain" in key "739c5b1cd5681e668f689aa66bcc254c" is "test"

答案 1 :(得分:1)

在您的数据中,'plain'不是parsed_json的成员。它 parsed_json['739c5b1cd5681e668f689aa66bcc254c']的成员。所以parsed_json['739c5b1cd5681e668f689aa66bcc254c']['plain']应该有用。

JSON是一种分层数据结构。顶级括号表示整个事物是一个将被分配给parsed_json的对象。每个成员都是一个名称 - 值对; 'REQUEST'的值为'FOUND'。但是,'739c5b1cd5681e668f689aa66bcc254c'的值是一个子对象,由左括号表示。其成员为'plain''hexplain''algorithm'。如果我这样写,这应该更清楚:

parsed_json: {
    "REQUEST":"FOUND",
    "739c5b1cd5681e668f689aa66bcc254c": {
        "plain":"test",
        "hexplain":"74657374",
        "algorithm":"MD5X5PLAIN"
    }
}