我正在解析一个json格式的日志文件, 并包含key:value pair形式的数据。
我被困在钥匙本身可变的地方。请查看随附的代码
在此代码中,我可以访问用户名,event_type,ip等密钥。
对我来说,问题是访问"提交内容中的值" 的关键所在i4x-IITB-CS101-problem-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-problem-33e4aac93dc84f368c93b1d08fa984fc_2_1 键和
这个键里面的数据??
答案 0 :(得分:1)
您不需要提前知道密钥,您可以简单地遍历字典:
for k,v in obj['event']['submission'].iteritems():
print(k,v)
答案 1 :(得分:0)
假设您有一个类型为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
})
希望这就是你所要求的。
答案 2 :(得分:0)
使用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-problem-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
当然可能有更好的方法来迭代字典,但是你可以根据你的编码品味或性能来选择,如果你有比这里发布的数据更大的数据类型。