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

Jawaban:


756

json.loads()

import json

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

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

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)

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.