Python kullanarak JSON dizesini dikteye dönüştürme


415

Python'daki JSON ile biraz kafam karıştı. Bana göre, bir sözlük gibi görünüyor ve bu yüzden bunu yapmaya çalışıyorum:

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

Ama yaptığımda print dict(json) bir hata veriyor.

Bu dizeyi bir yapıya nasıl dönüştürebilirim ve sonra json["title"]"örnek sözlük" elde etmek için nasıl çağırabilirim ?

Yanıtlar:


756

json.loads()

import json

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

9
Json.load ve json.loads arasındaki fark nedir?
Shivam Agrawal

5
@ShivamAgrawal: Tam olarak ne diyor teneke .
Ignacio Vazquez-Abrams

64
@ShivamAgrawal: Fark, .load()bir dosya nesnesini ayrıştırması; .loads()bir dize / unicode nesnesini ayrıştırır.
fyngyrz

1
Bu işlevin yazarının, çağrılacak doğru işlevi otomatik olarak seçmek için iletilen veriler üzerinde bir tür denetimi yapmak için bir sarıcı işlevi yazmadığı beni rahatsız ediyor. Ayrıca kullanılan belirsiz isimlendirmeyi sevmiyorum. İşte bununla mücadele etmek için yazdım: 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) Eminim bu geliştirilebilir, ancak şimdi d = read_json(j)bir json 'str' veya 'file' diyebilirsiniz .
Jacques Mathieu

2
@JacquesMathieu, Merhaba Jacques, işleviniz için teşekkürler, bazen sözlükler kullandığım için küçük bir gelişme yaptım: def read_json (json_data): if (type (json_data) == str): # Dizeler için json.loads (json_data) elif döndür (str (type (json_data)) == "<class '_io.TextIOWrapper'>"): # Dosyalar için json.load (json_data) elif (type (json_data) == dict) döndürür: # Sözlükler için json.loads döndürür (json.dumps (json_data))
Gabriel Aizcorbe

98

Json kullanmaya başladığımda kafam karıştı ve bir süre çözemedim, ama sonunda istediğimi aldım
İşte basit çözüm

import json
m = {'id': 2, 'name': 'hussain'}
n = json.dumps(m)
o = json.loads(n)
print(o['id'], o['name'])

Neden ilk önce çöpe atıyorsun (m)?
Han Van Pham

Serileştirmeyi ve serileştirmeyi göstermek için kullandım. Kullanılması loads(..)üzerinde '{"id": 2, "name": "hussain"}'de kabul cevap gibi ince olmalıdır.
Hussain

1
Çöplükler ve yükler benim için mükemmel çalışıyor, kabul edilen cevap olmasa da, beni kurtardığı için çok teşekkürler @Hussain time, FYI, loadsutf-8 kodlamasıyla dinamik dizelerden çalışıyorum ...
Mohammed Sufian

19

hızlandırmalar için simplejson veya cjson kullanın

import simplejson as json

json.loads(obj)

or 

cjson.decode(obj)

16

Veri kaynağına güveniyorsanız, evaldizenizi bir sözlüğe dönüştürmek için kullanabilirsiniz :

eval(your_json_format_string)

Misal:

>>> 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
Örneğinizdeki dize JSON değil.
bfontaine

1
Doğru. Kolayca JSON olarak yüklenebilen / boşaltılabilen bir sözlük için değişir (ve sözlüğünüzde hiç json değeri yoksa özel bir json kodlayıcı işlevine ihtiyacınız olabilir).
Bölüm

3
Hayır. Giriş verilerini asla kod olarak değerlendirmemelisiniz. Bu, güvendiğiniz verileri kullanan küçük evcil hayvan projeniz olabilir, ancak kötü kod yeniden kullanılabilir ve kötü uygulamalar gerçek projelerde tekrarlanabilir ve büyük bir güvenlik kodu bırakır.
NetworkMeister

Bu yüzden cevabım "veri kaynağına güveniyorsanız" ile başlar! Ama doğru, bu daha çok bir hack ve kesinlikle en iyi uygulama değil.
kakhkAtion

Kendi kaynağınızsa veri kaynağına tamamen güvenebilirsiniz. Bu aslında, dizelenmiş bir JS nesnesini bir dikoya uygun bir JSON dizesine dönüştürmek için kullanışlıdır.
Vadorequest
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.