Преобразовать строку JSON в DICT, используя Python

415

Я немного запутался с JSON в Python. Мне кажется, словарь, и по этой причине я пытаюсь сделать это:

{
    "glossary":
    {
        "title": "example glossary",
        "GlossDiv":
        {
            "title": "S",
            "GlossList":
            {
                "GlossEntry":
                {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef":
                    {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

Но когда я это делаю print dict(json), выдает ошибку.

Как я могу преобразовать эту строку в структуру и затем вызвать json["title"]"пример глоссария"?

Фриас
источник

Ответы:

756

json.loads()

import json

d = json.loads(j)
print d['glossary']['title']
Игнасио Васкес-Абрамс
источник
9
В чем разница между json.load и json.loads?
Шивам Агравал
5
@ShivamAgrawal: Именно то, что написано на банке .
Игнасио Васкес-Абрамс
64
@ShivamAgrawal: Разница в том, что .load()анализирует файловый объект; .loads()разбирает строковый / юникод-объект.
fyngyrz 19.09.16
1
Меня беспокоит, что автор этой функции не написал функцию-обертку для проверки типа передаваемых данных, чтобы автоматически выбрать правильную функцию для вызова. Мне также не нравится расплывчатая номенклатура. Вот что я написал для борьбы с этим: def read_json(json_data): if (type(json_data) == str): return json.loads(json_data) elif (str(type(json_data)) == "<class '_io.TextIOWrapper'>"): return json.load(json_data) я уверен, что это можно улучшить, но теперь вы можете вызвать d = read_json(j)json 'str' или 'file'.
Жак Матье
2
@JacquesMathieu, Привет, Жак, спасибо за твою функцию, я сделал небольшое улучшение, так как иногда использую словари: def read_json (json_data): if (type (json_data) == str): # Для строк вернуть json.loads (json_data) elif (str (type (json_data)) == "<class '_io.TextIOWrapper'>"): # Для файлов возвращать json.load (json_data) elif (type (json_data) == dict): # Для словарей возвращать json.loads (json.dumps (json_data))
Габриэль Айскорб
98

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

import json
m = {'id': 2, 'name': 'hussain'}
n = json.dumps(m)
o = json.loads(n)
print(o['id'], o['name'])
Хуссейн
источник
Почему ты сначала выбрасываешь (м)?
Хан Ван Фам
Я использовал его для демонстрации сериализации и десериализации. Использование loads(..)on '{"id": 2, "name": "hussain"}'также должно быть хорошо, как принятый ответ.
Хуссейн
1
dumps и load работает идеально для меня, хотя принятый ответ - нет, спасибо большое @Hussain за спасение меня time, к вашему сведению, я пытаюсь получить loadsдинамические строки с кодировкой utf-8 ...
Мухаммед Суфиан,
19

используйте simplejson или cjson для ускорения

import simplejson as json

json.loads(obj)

or 

cjson.decode(obj)
locojay
источник
16

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

eval(your_json_format_string)

Пример:

>>> x = "{'a' : 1, 'b' : True, 'c' : 'C'}"
>>> y = eval(x)

>>> print x
{'a' : 1, 'b' : True, 'c' : 'C'}
>>> print y
{'a': 1, 'c': 'C', 'b': True}

>>> print type(x), type(y)
<type 'str'> <type 'dict'>

>>> print y['a'], type(y['a'])
1 <type 'int'>

>>> print y['a'], type(y['b'])
1 <type 'bool'>

>>> print y['a'], type(y['c'])
1 <type 'str'>
kakhkAtion
источник
1
Строка в вашем примере не является JSON.
bfontaine
1
Правда. Он превращается в словарь tho, который можно легко загрузить / выгрузить как JSON (и, конечно, вам может понадобиться пользовательская функция кодировщика json, если в вашем словаре нет значений json).
kakhkAtion
3
Нет. Никогда не оценивайте входные данные как код. Это может быть ваш маленький любимый проект, который использует данные, которым вы доверяете, но плохой код можно использовать повторно, а плохие практики повторять в реальных проектах, оставляя большой код безопасности.
NetworkMeister
И вот почему мой ответ начинается с «если вы доверяете источнику данных»! Но правда, это скорее взлом, и определенно не лучшая практика.
kakhkAtion
Вы можете полностью доверять источнику данных, если он ваш. На самом деле это полезно для преобразования строкового объекта JS в dic в правильную строку JSON.
Vadorequest