Перетворити рядок JSON в диктат за допомогою 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()аналізує об'єкт string / unicode.
fyngyrz

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 (тип (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(..)на '{"id": 2, "name": "hussain"}'також має бути добре , як прийнято відповідати.
Хуссей

1
сміття та навантаження для мене ідеально підходить, тоді як прийнята відповідь - ні, дякую @Hussain за те, що врятував мене time, FYI, я намагаюсь loadsіз динамічних рядків з кодуванням utf-8 ...
Мохаммед Суфіан

19

використовувати simplejson або cjson для прискорень

import simplejson as json

json.loads(obj)

or 

cjson.decode(obj)

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'>

1
Рядок у вашому прикладі не є JSON.
bfontaine

1
Правда. Це стосується словника tho, який можна легко завантажити / скинути як JSON (і, звичайно, вам може знадобитися спеціальна функція кодера json, якщо у вашому словнику немає значень json).
kakhkAtion

3
Ні. Ніколи не слід оцінювати вхідні дані як код. Це може бути проект вашого маленького домашнього улюбленця, який використовує дані, яким ви довіряєте, але поганий код можна повторно використовувати, а погані практики повторювати в реальних проектах, залишаючи великий код безпеки.
NetworkMeister

І тому моя відповідь починається з "якщо ви довіряєте джерелу даних"! Але правда, це більше хак, і, безумовно, не найкраща практика.
kakhkAtion

Ви можете повністю довіряти джерелу даних, якщо це ваше власне. Це насправді корисно для перетворення об'єднаного об'єкта JS в дік у відповідний рядок JSON.
Vadorequest
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.