Ubah string JSON menjadi dikt menggunakan Python

415

Saya sedikit bingung dengan JSON di Python. Bagi saya, sepertinya kamus, dan untuk alasan itu saya mencoba melakukan itu:

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

Tetapi ketika saya melakukannya print dict(json), itu memberikan kesalahan.

Bagaimana saya bisa mengubah string ini menjadi struktur dan kemudian memanggil json["title"]untuk mendapatkan "contoh glosarium"?

Frias
sumber

Jawaban:

756

json.loads()

import json

d = json.loads(j)
print d['glossary']['title']
Ignacio Vazquez-Abrams
sumber
9
Apa perbedaan antara json.load dan json.loads?
Shivam Agrawal
5
@ShivamAgrawal: Persis seperti yang tertulis di kaleng .
Ignacio Vazquez-Abrams
64
@ShivamAgrawal: Perbedaannya adalah bahwa .load()mem-parsing objek file; .loads()mem-parsing objek string / unicode.
fyngyrz
1
Itu mengganggu saya bahwa penulis fungsi ini tidak menulis fungsi pembungkus untuk melakukan pemeriksaan tipe pada data yang diteruskan untuk secara otomatis memilih fungsi yang tepat untuk dipanggil. Saya juga tidak suka nomenklatur yang samar-samar digunakan. Inilah yang saya tulis untuk memerangi ini: 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) Saya yakin ini bisa diperbaiki, tetapi sekarang Anda dapat memanggil d = read_json(j)'str' atau 'file' json.
Jacques Mathieu
2
@ JacquesMathieu, Hi Jacques, thanx untuk fungsi Anda, saya melakukan perbaikan kecil karena saya kadang-kadang menggunakan kamus: def read_json (json_data): if (type (json_data) == str): # Untuk string kembalikan json.loads (json_data) elif (str (type (json_data)) == "<class '_io.TextIOWrapper'>"): #Untuk file mengembalikan json.load (json_data) elif (type (json_data) == dict): # Untuk kamus, kembalikan json.loads (json.dumps (json_data))
Gabriel Aizcorbe
98

Ketika saya mulai menggunakan json, saya bingung dan tidak dapat mengetahuinya selama beberapa waktu, tetapi akhirnya saya mendapatkan apa yang saya inginkan.
Berikut adalah solusi sederhana

import json
m = {'id': 2, 'name': 'hussain'}
n = json.dumps(m)
o = json.loads(n)
print(o['id'], o['name'])
Hussain
sumber
Mengapa Anda membuang (m) dulu?
Han Van Pham
Saya menggunakannya untuk menunjukkan serialisasi dan deserialisasi. Menggunakan loads(..)pada '{"id": 2, "name": "hussain"}'juga harus baik-baik saja seperti jawaban yang diterima.
Hussain
1
kesedihan dan banyak bekerja sempurna untuk saya, sedangkan jawaban yang diterima tidak, terima kasih banyak @Hussain telah menyelamatkan saya time, FYI, saya mencoba loadsdari string dinamis dengan pengkodean utf-8 ...
Mohammed Sufian
19

gunakan simplejson atau cjson untuk speedups

import simplejson as json

json.loads(obj)

or 

cjson.decode(obj)
locojay
sumber
16

Jika Anda mempercayai sumber data, Anda dapat menggunakan evaluntuk mengubah string Anda ke dalam kamus:

eval(your_json_format_string)

Contoh:

>>> 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
sumber
1
String dalam contoh Anda bukan JSON.
bfontaine
1
Benar. Ini merujuk ke kamus, yang dapat dengan mudah dimuat / dibuang sebagai JSON (dan tentu saja Anda mungkin memerlukan fungsi penyandi json kustom jika kamus Anda tidak memiliki nilai json).
kakhkAtion
3
Tidak. Anda tidak boleh mengevaluasi data input sebagai kode. Ini mungkin proyek hewan peliharaan kecil Anda yang menggunakan data yang Anda percayai, tetapi kode buruk dapat digunakan kembali dan praktik buruk diulang dalam proyek nyata, meninggalkan kode keamanan besar.
NetworkMeister
Dan itulah mengapa jawaban saya dimulai dengan "jika Anda mempercayai sumber data"! Tapi benar, ini lebih merupakan peretasan, dan jelas bukan praktik terbaik.
kakhkAtion
Anda benar-benar dapat mempercayai sumber data jika itu milik Anda sendiri. Ini sebenarnya berguna untuk mengubah objek JS yang dirubah menjadi dic menjadi string JSON yang tepat.
Vadorequest