Konwertuj ciąg JSON na dyktowanie za pomocą Pythona

415

Jestem trochę mylony z JSON w Pythonie. Wydaje mi się, że to słownik, dlatego staram się to zrobić:

{
    "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"
                }
            }
        }
    }
}

Ale kiedy to robię print dict(json), pojawia się błąd.

Jak mogę przekształcić ten ciąg w strukturę, a następnie wywołać, json["title"]aby uzyskać „przykładowy słownik”?

Frias
źródło

Odpowiedzi:

756

json.loads()

import json

d = json.loads(j)
print d['glossary']['title']
Ignacio Vazquez-Abrams
źródło
9
Jaka jest różnica między json.load a json.loads?
Shivam Agrawal
5
@ShivamAgrawal: Dokładnie to, co jest napisane na puszce .
Ignacio Vazquez-Abrams,
64
@ShivamAgrawal: Różnica polega na tym, że .load()analizuje obiekt pliku; .loads()analizuje obiekt string / Unicode.
fyngyrz
1
Niepokoi mnie to, że autor tej funkcji nie napisał funkcji otoki w celu sprawdzenia typu przekazywanych danych, aby automatycznie wybrać odpowiednią funkcję do wywołania. Nie podobają mi się również stosowane niejasne nazewnictwo. Oto, co napisałem, aby z tym walczyć: 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) jestem pewien, że można to poprawić, ale teraz możesz wywołać d = read_json(j)json „str” lub „file”.
Jacques Mathieu
2
@JacquesMathieu, Hi Jacques, thanx dla twojej funkcji, zrobiłem drobną poprawę, ponieważ czasami używam słowników: def read_json (json_data): if (type (json_data) == str): # Dla ciągów zwracaj json.loads (json_data) elif (str (type (json_data)) == "<klasa '_io.TextIOWrapper'>"): #Dla plików zwraca json.load (json_data) elif (type (json_data) == dict): # Dla słowników zwróć json.loads (json.dumps (json_data))
Gabriel Aizcorbe
98

Kiedy zacząłem używać Jsona, byłem zdezorientowany i przez pewien czas nie byłem w stanie go rozgryźć, ale w końcu dostałem to, czego chciałem.
Oto proste rozwiązanie

import json
m = {'id': 2, 'name': 'hussain'}
n = json.dumps(m)
o = json.loads(n)
print(o['id'], o['name'])
Hussain
źródło
Dlaczego najpierw wyrzucasz (m)?
Han Van Pham
Użyłem go do zademonstrowania serializacji i deserializacji. Używanie loads(..)dalej '{"id": 2, "name": "hussain"}'powinno być w porządku, tak jak zaakceptowana odpowiedź.
Hussain,
1
zrzuty i ładunki działają dla mnie idealnie, podczas gdy zaakceptowana odpowiedź nie jest, dziękuję bardzo @Hussain za uratowanie mnie time, FYI, próbuję loadsod dynamicznych ciągów z kodowaniem utf-8 ...
Mohammed Sufian
19

użyj simplejson lub cjson do przyspieszeń

import simplejson as json

json.loads(obj)

or 

cjson.decode(obj)
locojay
źródło
16

Jeśli ufasz źródłu danych, możesz użyć go evaldo konwersji łańcucha na słownik:

eval(your_json_format_string)

Przykład:

>>> 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
źródło
1
Łańcuch w twoim przykładzie nie jest JSON.
bfontaine,
1
Prawdziwe. Sprawdza się w słowniku, który można łatwo załadować / zrzucić jako JSON (i oczywiście może być potrzebna niestandardowa funkcja kodera json, jeśli słownik nie ma żadnych wartości json).
kakhkAtion
3
Nie. Nigdy nie należy oceniać danych wejściowych jako kodu. Może to być twój mały projekt zwierzaka, który wykorzystuje dane, którym ufasz, ale zły kod może być ponownie użyty, a złe praktyki powtórzone w prawdziwych projektach, pozostawiając duży kod bezpieczeństwa.
NetworkMeister,
I dlatego moja odpowiedź zaczyna się od „jeśli ufasz źródłu danych”! Ale to prawda, jest to raczej hack i zdecydowanie nie najlepsza praktyka.
kakhkAtion
Możesz całkowicie zaufać źródłu danych, jeśli jest ono własne. Przydaje się to do konwersji strunowego obiektu JS w dic na prawidłowy ciąg JSON.
Vadorequest,