Как разобрать JSON в Python?

282

Мой проект в настоящее время получает сообщение JSON на python, из которого мне нужно получить информацию. Для этого давайте зададим ему простой JSON в строке:

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

До сих пор я генерировал JSON-запросы, используя список, а затем json.dumps, но чтобы сделать обратное, я думаю, что мне нужно использовать json.loads. Однако мне не очень повезло с этим. Может ли кто-нибудь предоставить мне фрагмент, который будет возвращен "2"с вводом "two"в приведенном выше примере?

ingh.am
источник
8
Примечание . Для тех, кто приходит сюда с данными, использующими 'разделители строк в одинарных кавычках, вы можете случайно создать строковые представления для словарей Python. JSON всегда" будет использовать разделители . Если так, исправьте свой код, который производит этот вывод, чтобы использовать json.dumps()вместо str()или repr(), и перейдите к Преобразовать строковое представление словаря в словарь? чтобы выяснить, как восстановить ваши данные Python. Другие подсказки у вас есть литерал Python? Ищите None, Trueили False, JSON будет использовать null, true& false.
Мартин Питерс
Те, у кого нет jsonStr, но есть список словарей (возможно, с 'разделителями строк в одинарных кавычках ), также могут посмотреть здесь: stackoverflow.com/questions/41168558/…
Лоренц

Ответы:

493

Очень просто:

import json
data = json.loads('{"one" : "1", "two" : "2", "three" : "3"}')
print data['two']
Джон Джотта
источник
Кроме того, взгляните на simplejson, если вам нужна лучшая производительность. Более поздние версии обеспечивают оптимизацию, которая значительно улучшает чтение и запись.
unode 14.10.11
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' для 'строки')

jisaacstone
источник
Просто добавьте, что вы можете получить содержимое строки, вызвав j.read (), а затем использовать метод load. В любом случае в этом случае метод load () позаботится о вызове .read ()
rkachach
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"}

Обратите внимание, что вы можете установить для идентификатора аргумента dump его печать следующим образом (например, при использовании print json.dumps (data, indent = 4)):

{
    "pk": 1, 
    "fb": {
        "new_key": "cc.ee was present!", 
        "fd_id": "12345", 
        "fc": ""
    }, 
    "fa": "cc.ee"
}
Venkat
источник
-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
Biranchi
источник
1
Вы не можете использовать ast.literal_eval()функцию для JSON, потому что помимо ваших простых текстовых и целочисленных примеров вы столкнетесь с проблемами. JSON это не Python . Тот факт, что некоторые JSON могут быть проанализированы ast.literal_eval(), не делает это правильным подходом.
Мартин Питерс
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 .
Мартин Питерс