Як розібрати JSON в Python?


282

Наразі мій проект отримує повідомлення в JSON в python, з якого мені потрібно отримати шматочки інформації. Для цього, давайте встановимо його на якийсь простий JSON в рядку:

jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'

Поки я генерував JSON запити, використовуючи список, а потім json.dumps, але щоб зробити протилежне цьому, я думаю, що мені потрібно використовувати json.loads. Однак мені не пощастило з цим. Чи міг би хтось надати мені фрагмент, який повернеться "2"із введенням "two"у наведеному вище прикладі?


8
Примітка . Для тих, хто приходить сюди з даними, які використовують 'роздільники рядків з одною цитатою, ви, можливо, випадково створили представлення рядків для словників Python. JSON завжди" буде використовувати роздільники . Якщо так, відремонтуйте свій код, який видає цей вихід для використання json.dumps()замість str()або repr(), та перейдіть до конвертації рядкового представлення словника у словник? щоб зрозуміти, як відновити дані Python. Інші підказки у вас є буквалом Python? Подивіться None, Trueчи False, JSON б використовувати null, trueі false.
Martijn Pieters

Тим, у кого немає jsonStr, але список словників (можливо, з розділовими рядками з одною 'цитатою), також дивіться тут: stackoverflow.com/questions/41168558/…
Lorenz

Відповіді:


493

Дуже просто:

import json
data = json.loads('{"one" : "1", "two" : "2", "three" : "3"}')
print data['two']

Крім того, погляньте на simplejson, якщо вам потрібна краща продуктивність. Більш новітні версії забезпечують оптимізацію, що значно покращує читання та запис.
unode

2
Я на насправді з допомогою simplejson вже: import simplejson as json. Забув згадати, але дякую :)
ingh.am

Зрозумів. Використовував .loadметод замість.loads
Суніл Кумар

85

Іноді ваш json не є рядком. Наприклад, якщо ви отримуєте json з такої URL-адреси:

j = urllib2.urlopen('http://site.com/data.json')

вам потрібно буде використовувати json.load, а не json.loads:

j_obj = json.load(j)

(легко забути: 's' - це 'string')


Просто додамо, що ви можете отримати вміст рядка, зателефонувавши j.read (), а потім скористатися методом навантаження. У будь-якому випадку метод load ()
допоможе

51

Для URL-адреси чи файлу використовуйте json.load(). Для рядків із вмістом .json використовуйте json.loads().

#! /usr/bin/python

import json
# from pprint import pprint

json_file = 'my_cube.json'
cube = '1'

with open(json_file) as json_data:
    data = json.load(json_data)

# pprint(data)

print "Dimension: ", data['cubes'][cube]['dim']
print "Measures:  ", data['cubes'][cube]['meas']

26

Наведемо простий приклад, який може вам допомогти:

json_string = """
{
    "pk": 1, 
    "fa": "cc.ee", 
    "fb": {
        "fc": "", 
        "fd_id": "12345"
    }
}"""

import json
data = json.loads(json_string)
if data["fa"] == "cc.ee":
    data["fb"]["new_key"] = "cc.ee was present!"

print json.dumps(data)

Вихід для вищевказаного коду буде:

{"pk": 1, "fb": {"new_key": "cc.ee was present!", "fd_id": "12345", 
 "fc": ""}, "fa": "cc.ee"}

Зауважте, що ви можете встановити ідентичний аргумент дампа для його друку так (наприклад, при використанні print json.dumps (дані, відступ = 4)):

{
    "pk": 1, 
    "fb": {
        "new_key": "cc.ee was present!", 
        "fd_id": "12345", 
        "fc": ""
    }, 
    "fa": "cc.ee"
}

-2

Можна використовувати модулі json або ast python:

Using json :
=============

import json
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_data = json.loads(jsonStr)
print(f"json_data: {json_data}")
print(f"json_data['two']: {json_data['two']}")

Output:
json_data: {'one': '1', 'two': '2', 'three': '3'}
json_data['two']: 2




Using ast:
==========

import ast
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_dict = ast.literal_eval(jsonStr)
print(f"json_dict: {json_dict}")
print(f"json_dict['two']: {json_dict['two']}")

Output:
json_dict: {'one': '1', 'two': '2', 'three': '3'}
json_dict['two']: 2

1
Ви не можете використовувати ast.literal_eval()функцію для JSON, тому що за межами вашого тривіального текст і цілочисельний-зразковими ви будете мати справу з проблемами. JSON - не Python . Тільки тому, що деякі JSON можна розібратися, ast.literal_eval()це не робить належним підходом.
Martijn Pieters

1
Наприклад, ви не можете проаналізувати r'{"foo": null, "bar": true, "baz": "\ud83e\udd26"}'використання ast.literal_eval(), оскільки він містить нулі, булеве значення та одну кодову точку, що не є BMP. JSON представляє ці значення по-різному від того, як би представляли їх літерали Python. json.loads()з іншого боку, не має ніяких проблем з цим входом і правильно декодує що {'foo': None, 'bar': True, 'baz': '🤦'}.
Martijn Пітерс

1
Далі, ast.literal_eval()це трохи повільніше і не може бути налаштований. Ніколи не слід використовувати його для розшифровки JSON .
Martijn Pieters
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.