Bagaimana cara mengurai JSON dengan Python?


282

Proyek saya saat ini menerima pesan JSON dengan python yang saya perlukan untuk mendapatkan bit informasi. Untuk keperluan ini, mari kita atur ke beberapa JSON sederhana dalam sebuah string:

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

Sejauh ini saya telah menghasilkan permintaan JSON menggunakan daftar dan kemudian json.dumps, tetapi untuk melakukan yang sebaliknya saya pikir saya perlu menggunakannya json.loads. Namun saya belum beruntung dengan itu. Adakah yang bisa memberi saya potongan yang akan kembali "2"dengan input "two"pada contoh di atas?


8
Catatan : Bagi mereka yang datang ke sini dengan data yang menggunakan 'pembatas string kutipan tunggal, Anda mungkin secara tidak sengaja membuat representasi string untuk kamus Python. JSON akan selalu menggunakan "pembatas . Jika demikian, perbaiki kode Anda yang menghasilkan keluaran untuk digunakan json.dumps()sebagai pengganti str()atau repr(), dan menuju ke Konversi representasi String dari Kamus ke kamus? untuk mengetahui cara memulihkan data Python Anda. Petunjuk lain Anda memiliki Python literal? Cari None, Trueatau False, JSON akan menggunakan null, true& false.
Martijn Pieters

Mereka yang tidak memiliki jsonStr tetapi daftar kamus (mungkin dengan 'pembatas string kutipan tunggal), juga dapat melihatnya di sini: stackoverflow.com/questions/41168558/…
Lorenz

Jawaban:


493

Sangat sederhana:

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

Juga, lihat simplejson jika Anda membutuhkan kinerja yang lebih baik. Versi yang lebih baru memberikan optimasi yang sangat meningkatkan membaca dan menulis.
unode

2
Aku benar-benar menggunakan simplejson sudah: import simplejson as json. Lupa menyebutkan tetapi terima kasih :)
ingh.am

Mengerti. Sedang menggunakan .loadmetode alih-alih.loads
Sunil Kumar

85

Terkadang json Anda bukan string. Misalnya jika Anda mendapatkan json dari url seperti ini:

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

Anda harus menggunakan json.load, bukan json.loads:

j_obj = json.load(j)

(mudah untuk dilupakan: 'untuk' string ')


Hanya untuk menambahkan bahwa Anda bisa mendapatkan konten string dengan memanggil j.read () dan kemudian menggunakan metode load. Cara apa pun dalam hal ini, metode load () menangani memanggil .read ()
rkachach

51

Untuk URL atau file, gunakan json.load(). Untuk string dengan konten .json, gunakan 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

Berikut ini adalah contoh sederhana yang dapat membantu Anda:

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)

Output untuk kode di atas adalah:

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

Perhatikan bahwa Anda dapat mengatur argumen ident dump untuk mencetaknya seperti itu (misalnya, ketika menggunakan print json.dumps (data, indent = 4)):

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

-2

Dapat menggunakan modul json atau ast python:

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
Anda tidak dapat menggunakan ast.literal_eval()fungsi untuk JSON, karena di luar contoh sepele teks dan integer Anda, Anda akan mengalami masalah. JSON bukan Python . Hanya karena beberapa JSON dapat diuraikan dengan ast.literal_eval()tidak membuat pendekatan yang tepat.
Martijn Pieters

1
Misalnya, Anda tidak dapat melakukan parse r'{"foo": null, "bar": true, "baz": "\ud83e\udd26"}'menggunakan ast.literal_eval(), karena mengandung nulls, nilai boolean, dan satu titik kode non-BMP. JSON mewakili nilai-nilai itu secara berbeda dari bagaimana literal Python akan mewakili nilai-nilai itu. json.loads()di sisi lain, tidak memiliki masalah dengan masukan itu dan benar decode itu untuk {'foo': None, 'bar': True, 'baz': '🤦'}.
Martijn Pieters

1
Selanjutnya, ast.literal_eval()sedikit lebih lambat dan tidak dapat dikustomisasi. Anda tidak boleh menggunakannya untuk mendekode JSON .
Martijn Pieters
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.