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”?

Odpowiedzi:


756

json.loads()

import json

d = json.loads(j)
print d['glossary']['title']

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

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)

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

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.