如何解析JSON,其中关键是Python变量?(how to parse json where ke

2019-10-30 11:53发布

我解析日志文件是JSON格式,并包含在密钥的形式的数据:值对。

我被困在地方密钥本身是可变的。 请看附代码

在这段代码中,我能够访问诸如用户名,EVENT_TYPE,IP等按键

我的问题是进入“提交”键,其中里面的值

i4x-IITB-CS101-问题33e4aac93dc84f368c93b1d08fa984fc_2_1是一个可变密钥,这将针对不同的用户改变,

我怎样才能访问它作为一个变量?

{
    "username": "batista",        
    "event_type": "problem_check",      
    "ip": "127.0.0.1",
    "event": {
        "submission": {
            "i4x-IITB-CS101-problem-33e4aac93dc84f368c93b1d08fa984fc_2_1": {
                "input_type": "choicegroup",
                "question": "",
                "response_type": "multiplechoiceresponse",
                "answer": "MenuInflater.inflate()",
                "variant": "",
                "correct": true
            }
        },
        "success": "correct",
        "grade": 1,
        "correct_map": {
            "i4x-IITB-CS101-problem-33e4aac93dc84f368c93b1d08fa984fc_2_1": {
                "hint": "",
                "hintmode": null,
                "correctness": "correct",
                "npoints": null,
                "msg": "",
                "queuestate": null
            }
        }

这是我的代码如何我解决它:

import json
import pprint
with open("log.log") as infile:
# Loop until we have parsed all the lines.
for line in infile:
    # Read lines until we find a complete object
    while (True):
        try:
            json_data = json.loads(line)

            username = json_data['username']
            print "username :- " + username

        except ValueError:                
            line += next(infile)

如何访问i4x-IITB-CS101-问题33e4aac93dc84f368c93b1d08fa984fc_2_1

这里面的关键数据?

Answer 1:

你并不需要预先知道键,你可以简单地在字典迭代:

for k,v in obj['event']['submission'].iteritems():
   print(k,v)


Answer 2:

假设有类型的字典d = {"a":"b"}然后d.popitem()会给你一个元组("a","b")其是(key,value) 。 因此,使用这个你可以访问键值对不知道的关键。

在你情况下,如果j是主词典然后j["event"]["submission"].popitem()将给你的元组

("i4x-IITB-CS101-problem-33e4aac93dc84f368c93b1d08fa984fc_2_1": {
                "input_type": "choicegroup",
                "question": "",
                "response_type": "multiplechoiceresponse",
                "answer": "MenuInflater.inflate()",
                "variant": "",
                "correct": true
            })

希望这是你在问什么。



Answer 3:

使用Python JSON模块,你最终会与解析的值从上面的JSON数据字典

 import json
 parsed = json.loads(this_sample_data_in_question)
 # parsed is a dictionary, so are "correct_map" and "submission" dictionary keys within "event" key 

所以,你可以遍历键,该数据作为普通字典的值,这样说:

 for k, v in parsed.items():
     print k, v

现在,你可以找到的“i4x-IITB-CS101-问题33e4aac93dc84f368c93b1d08fa984fc_2_1”在这样的快捷方式键的(可能不同的值):

import json

parsed = json.loads(the_data_in_question_as_string)
event = parsed['event']

for key, val in event.items():
    if key in ('correct_map', 'submission'):
        section = event[key]
        for possible_variable_key, its_value in section.items():
            print possible_variable_key, its_value

当然也有可能是遍历字典的更好的方式,但您的编码味道,还是性能是一个你可以选择基础,如果你有一个相当大的实物比一个张贴在这里的数据。



文章来源: how to parse json where key is variable in python?