2014-09-22 1 views
0

Я разбираю файл журнала, который находится в json формате, и содержит данные в виде пары ключ: значение.как разбирать json, где ключ является переменной в python?

Я застрял в месте, где ключ сам по себе является переменным. пожалуйста, смотрите на прилагаемом коде

в этом коде я могу получить доступ к разделам, как имя пользователя, 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 ключ и

данных внутри этого ключа? ?

ответ

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 
      }) 

Надежда это то, что вы просили.

1

Вам не нужно знать ключ заранее, вы можете просто перебрать словарь:

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

с помощью модуля питон 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 

Конечно там может быть лучшим способом итерации над словарь, но тот, который вы можете выбрать, основываясь на своем вкусе кодирования или производительности, если у вас есть довольно больший вид данных, чем тот, который вы разместили здесь.

+0

спасибо за ответ farzad Я добавил свой код, пожалуйста, проверьте его, как я могу подстроить ваш код там? – rajsinghaniaful

+0

Этот пример кода выше будет работать для проблемы, упомянутой в вопросе. Переменная «its_value» является ответом на вашу проблему.это словарь, который имеет ключи «подсказка», «hintmode», ... Однако я не думаю, что способ чтения строк в файле журнала правильный. Нет необходимости в _while True_ и _next (infile) _. цикл _for_ будет читать все строки файла и попытаться проанализировать содержимое JSON каждой строки. – farzad

Смежные вопросы