Python JSON ayrıştırma nasıl yapılır?


282

Projem şu anda python içinde bilgi bitlerini almak için gereken bir JSON iletisi alıyor. Bunun amaçları için, bir dizede bazı basit JSON olarak ayarlayalım:

jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'

Şimdiye kadar bir liste kullanarak JSON istekleri üretiyordum ve sonra json.dumpsbunun tersini yapmak için kullanmam gerektiğini düşünüyorum json.loads. Ancak bu konuda pek şansım olmadı. Birisi bana yukarıdaki örnekteki "2"girdi ile geri dönecek bir pasaj sağlayabilir "two"mi?


8
Not : Buraya 'tek tırnaklı dize sınırlayıcıları kullanan verilerle gelenler için, Python sözlükleri için yanlışlıkla dize ifadeleri oluşturmuş olabilirsiniz. JSON her zaman "sınırlayıcı kullanır . Öyleyse json.dumps(), str()veya yerine kullanmak üzere bu çıktıyı üreten kodunuzu onarın repr()ve Sözlük'ün Dize temsilini sözlüğe dönüştürmek için üzerine gidin. Python verilerinizi nasıl kurtaracağınızı öğrenin. Python hazır bilginiz olan diğer ipuçları? Bak None, Trueya FalseJSON kullanırsınız null, true& false.
Martijn Pieters

Bir jsonStr bilgisi olmayan ancak sözlük listesi (muhtemelen 'tek tırnaklı dize sınırlayıcıları olan) olanlar da buraya bir göz atabilir : stackoverflow.com/questions/41168558/…
Lorenz

Yanıtlar:


493

Çok basit:

import json
data = json.loads('{"one" : "1", "two" : "2", "three" : "3"}')
print data['two']

Ayrıca, daha iyi performansa ihtiyacınız varsa simplejson'a bir göz atın . Daha yeni sürümler, okuma ve yazmayı büyük ölçüde geliştiren optimizasyonlar sağlar.
unode

2
Aslında zaten simplejson kullanıyorum: import simplejson as json. Bahsetmeyi unuttum ama teşekkürler :)
ingh.am

Anladım. Yerine .loadyöntem kullanıyordum.loads
Sunil Kumar

85

Bazen json'unuz bir dize değildir. Örneğin, böyle bir URL'den bir json alıyorsanız:

j = urllib2.urlopen('http://site.com/data.json')

json.load'ları değil, json.load'u kullanmanız gerekir:

j_obj = json.load(j)

(unutulması kolaydır: 's' 'string' içindir)


Sadece eklemek için dize içeriğini j.read () çağırarak alabilir ve daha sonra loads yöntemini kullanabilirsiniz. Bu durumda herhangi bir şekilde load () yöntemi, .read ()
rkachach'ı çağırır

51

URL veya dosya için kullanın json.load(). .Json içeriği, kullanımı ile dize için json.loads().

#! /usr/bin/python

import json
# from pprint import pprint

json_file = 'my_cube.json'
cube = '1'

with open(json_file) as json_data:
    data = json.load(json_data)

# pprint(data)

print "Dimension: ", data['cubes'][cube]['dim']
print "Measures:  ", data['cubes'][cube]['meas']

26

Aşağıda size yardımcı olabilecek basit bir örnek verilmiştir:

json_string = """
{
    "pk": 1, 
    "fa": "cc.ee", 
    "fb": {
        "fc": "", 
        "fd_id": "12345"
    }
}"""

import json
data = json.loads(json_string)
if data["fa"] == "cc.ee":
    data["fb"]["new_key"] = "cc.ee was present!"

print json.dumps(data)

Yukarıdaki kodun çıktısı:

{"pk": 1, "fb": {"new_key": "cc.ee was present!", "fd_id": "12345", 
 "fc": ""}, "fa": "cc.ee"}

Dökümü tanımlama argümanını şu şekilde yazdırmak için ayarlayabileceğinizi unutmayın (örneğin, print json.dumps (data, indent = 4) kullanırken):

{
    "pk": 1, 
    "fb": {
        "new_key": "cc.ee was present!", 
        "fd_id": "12345", 
        "fc": ""
    }, 
    "fa": "cc.ee"
}

-2

Json veya ast python modüllerini kullanabilir:

Using json :
=============

import json
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_data = json.loads(jsonStr)
print(f"json_data: {json_data}")
print(f"json_data['two']: {json_data['two']}")

Output:
json_data: {'one': '1', 'two': '2', 'three': '3'}
json_data['two']: 2




Using ast:
==========

import ast
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_dict = ast.literal_eval(jsonStr)
print(f"json_dict: {json_dict}")
print(f"json_dict['two']: {json_dict['two']}")

Output:
json_dict: {'one': '1', 'two': '2', 'three': '3'}
json_dict['two']: 2

1
Sen kullanamaz ast.literal_eval()sen çünkü önemsiz metin ve tam sayılı okunur örneklerin ötesine, JSON için işlevini edecek sorunları çalıştırmak. JSON Python değil . Çünkü bazı JSON ile çözümlenebilir ast.literal_eval()uygun bir yaklaşımla bu yapmaz.
Martijn Pieters

1
Örneğin, nulls, bir boole değeri ve tek bir BMP olmayan kod noktası içerdiğinden r'{"foo": null, "bar": true, "baz": "\ud83e\udd26"}'kullanarak ayrıştıramazsınız ast.literal_eval(). JSON bu değerleri Python değişmezlerinin bunları nasıl temsil edeceğinden farklı temsil eder. json.loads()Öte yandan, bu giriş ile hiçbir sorunları vardır ve doğru olarak deşifre olduğu için {'foo': None, 'bar': True, 'baz': '🤦'}.
Martijn Pieters

1
Sonra, ast.literal_eval()biraz daha yavaş ve özelleştirilemez. Sen olmalıdır JSON kodunu çözmek için kullanmak asla .
Martijn Pieters
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.