Разбор JSON в python с использованием JSONPath - PullRequest
0 голосов
/ 12 октября 2019

В JSON ниже я хочу получить доступ к email-идентификатору и полю 'gamesplayed' для каждого пользователя.

 "UserTable" : {
     "abcd@gmailcom" : {
        "gameHistory" : {
           "G1" : [ {
             "category" : "1",
             "questiontext" : "What is the cube of 2 ?"
           }, {
             "category" : "2",
             "questiontext" : "What is the cube of 4 ?"
           } ]
         },
        "gamesplayed" : 2
      },
     "xyz@gmailcom" : {
        "gameHistory" : {
           "G1" : [ {
             "category" : "1",
             "questiontext" : "What is the cube of 2 ?"
           }, {
             "category" : "2",
             "questiontext" : "What is the cube of 4 ?"
           } ]
         },
        "gamesplayed" : 2
      }
}

Ниже приведен код, который я использую, чтобы попытаться получить доступ к электронному идентификатору пользователя:

for user in jp.match("$.UserTable[*].[0]", game_data):
    print("User ID's {}".format(user_id))

Это ошибка, которую я получаю:

  File "C:\ProgramData\Anaconda3\lib\site-packages\jsonpath_rw\jsonpath.py", line 444, in find
    return [DatumInContext(datum.value[self.index], path=self, context=datum)]

KeyError: 0

И когда я запускаю следующую строку и получаю доступ к полю «gamesplayed» для каждого пользователя, происходит сбой IDE.

print (parser.ExtentedJsonPathParser().parse("$.*.gamesplayed").find(gd_info))

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Python может обрабатывать допустимые json как словари. Поэтому вы должны проанализировать строку json в словаре Python.

import json
dic = json.loads(json_str)

Теперь вы можете получить доступ к значению, используя определенный ключ в качестве индекса value = dict[key].

for user in dic:
    email = user
    gamesplayed = dic[user][gamesplayed]
    print("{0} played {1} game(s).".format(email, str(gamesplayed)))

>>> abcd@gmailcom played 2 game(s).
    xyz@gmailcom played 2 game(s).
0 голосов
/ 13 октября 2019

Если вы хотите использовать JSONPath. Пожалуйста, попробуйте это.

Код Python:

with open(json_file) as json_file:
    raw_data = json.load(json_file)

jsonpath_expr = parse('$.UserTable')
players = [match.value for match in jsonpath_expr.find(raw_data)][0]
emails = players.keys()

result = [{'email': email, 'gamesplayed': players[email]['gamesplayed']} for email in emails ]
print (result)

Вывод:

[{'email': 'abcd@gmailcom', 'gamesplayed': 2}, {'email': 'xyz@gmailcom', 'gamesplayed': 2}]
...