Làm cách nào để phân tích JSON trong Python?


281

Dự án của tôi hiện đang nhận được một thông báo JSON bằng python mà tôi cần lấy các thông tin ra khỏi đó. Với mục đích này, hãy đặt nó thành một số JSON đơn giản trong một chuỗi:

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

Cho đến nay tôi đã tạo các yêu cầu JSON bằng cách sử dụng một danh sách json.dumps, nhưng để làm điều ngược lại với điều này tôi nghĩ rằng tôi cần phải sử dụng json.loads. Tuy nhiên tôi đã không gặp nhiều may mắn với nó. Bất cứ ai cũng có thể cung cấp cho tôi một đoạn mã sẽ trả về "2"với đầu vào "two"trong ví dụ trên không?


8
Lưu ý : Đối với những người đến đây với dữ liệu sử dụng 'các dấu phân cách chuỗi trích dẫn đơn, bạn có thể đã vô tình tạo các biểu diễn chuỗi cho từ điển Python thay thế. JSON sẽ luôn sử dụng các "dấu phân cách . Nếu vậy, hãy sửa mã của bạn tạo ra đầu ra đó để sử dụng json.dumps()thay vì str()hoặc repr(), và chuyển sang biểu diễn Chuỗi của Từ điển thành từ điển? để tìm ra cách khôi phục dữ liệu Python của bạn. Những manh mối khác bạn có một chữ Python? Tìm kiếm None, Truehoặc False, JSON sẽ sử dụng null, true& false.
Martijn Pieters

Những người không có jsonStr nhưng một danh sách các từ điển (có thể có 'các dấu phân cách chuỗi trích dẫn đơn), cũng có một cái nhìn ở đây: stackoverflow.com/questions/41168558/ trộm
Lorenz

Câu trả lời:


492

Rất đơn giản:

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

Ngoài ra, hãy xem Simplejson nếu bạn cần hiệu suất tốt hơn. Các phiên bản gần đây hơn cung cấp tối ưu hóa cải thiện đáng kể đọc và viết.
giải mã

2
Tôi thực sự đang sử dụng Simplejson rồi : import simplejson as json. Quên đề cập đến nhưng cảm ơn :)
ingh.am

Hiểu rồi. Đã sử dụng .loadphương pháp thay vì.loads
Sunil Kumar

85

Đôi khi json của bạn không phải là một chuỗi. Ví dụ: nếu bạn nhận được json từ một url như thế này:

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

bạn sẽ cần sử dụng json.load chứ không phải json.loads:

j_obj = json.load(j)

(rất dễ quên: 's' dành cho 'chuỗi')


Chỉ cần thêm rằng bạn có thể lấy nội dung chuỗi bằng cách gọi j.read () và sau đó sử dụng phương thức tải. Bất kỳ cách nào trong trường hợp này, phương thức load () đều quan tâm đến việc gọi
.read

51

Đối với URL hoặc tệp, sử dụng json.load(). Đối với chuỗi có nội dung .json, sử dụng 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

Sau đây là ví dụ đơn giản có thể giúp bạn:

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)

Đầu ra cho mã trên sẽ là:

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

Lưu ý rằng bạn có thể đặt đối số nhận dạng của kết xuất để in như vậy (ví dụ: khi sử dụng print json.dumps (data, indent = 4)):

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

-2

Có thể sử dụng mô-đun python json hoặc ast:

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
Bạn không thể sử dụng ast.literal_eval()hàm cho JSON, vì ngoài các ví dụ văn bản và số nguyên tầm thường của bạn, bạn sẽ gặp vấn đề. JSON không phải là Python . Chỉ vì một số JSON có thể được phân tích cú pháp ast.literal_eval()mà không làm cho nó trở thành một cách tiếp cận phù hợp.
Martijn Pieters

1
Ví dụ: bạn không thể phân tích cú pháp r'{"foo": null, "bar": true, "baz": "\ud83e\udd26"}'bằng cách sử dụng ast.literal_eval(), bởi vì nó chứa null, giá trị boolean và một mật mã không phải BMP. JSON đại diện cho các giá trị đó khác với cách các chữ Python sẽ đại diện cho các giá trị đó. json.loads()Mặt khác, không có vấn đề với đầu vào đó và chính xác giải mã đó để {'foo': None, 'bar': True, 'baz': '🤦'}.
Martijn Pieters

1
Tiếp theo, ast.literal_eval()là khá chậm một chút và không thể được tùy chỉnh. Bạn không bao giờ nên sử dụng nó để giải mã JSON .
Martijn Pieters
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.