Làm cách nào để tự động xây dựng một đối tượng JSON bằng Python?


274

Tôi chưa quen với Python và tôi đang chơi với dữ liệu JSON. Tôi muốn tự động xây dựng một đối tượng JSON bằng cách thêm một số giá trị khóa vào một đối tượng JSON hiện có.

Tôi đã thử như sau nhưng tôi nhận được TypeError: 'str' object does not support item assignment:

import json

json_data = json.dumps({})
json_data["key"] = "value"

print 'JSON: ', json_data

Câu trả lời:


553

Bạn xây dựng đối tượng trước khi mã hóa nó thành chuỗi JSON:

import json

data = {}
data['key'] = 'value'
json_data = json.dumps(data)

JSON là một định dạng tuần tự hóa , dữ liệu văn bản đại diện cho một cấu trúc. Nó không phải là, chính nó, cấu trúc đó.


2
Giải pháp của bạn làm việc như một cơ duyên đối với tôi. Tôi không thể hiểu ý nghĩa của dòng cuối cùng của bạn, bạn có thể vui lòng giải thích điều đó một chút. Cảm ơn.
akki

6
@akki: OP đã cố gắng coi chuỗi JSON (một chuỗi các ký tự mã hóa một đối tượng) làm chính đối tượng đó. Họ đã cố gắng sử dụng json_data['key'] = 'value', nó không hoạt động vì json_datakhông phải là từ điển Python.
Martijn Pieters

đưa ra một đối tượng có thể tự động chuyển đổi đối tượng thành JSON hoặc từ điển bằng cách nào đó?
Charlie Parker

@CharlieParker: cách đó quá rộng. Các đối tượng Python không được phản ánh đơn giản vào JSON, vì JSON là một định dạng khá hạn chế chỉ có một vài loại dữ liệu. Có rất nhiều câu hỏi ở đây về SO đã bao gồm các loại đối tượng và JSON cụ thể , chẳng hạn như các mô hình Django hoặc SQLAlchemy, v.v.
Martijn Pieters

1
@AlexJohnson: pip listcung cấp cho bạn thông tin tương tự và có thể xuất JSON:pip list --format=json
Martijn Pieters

23

Bạn có thể tạo từ điển Python và tuần tự hóa nó thành JSON trong một dòng và nó thậm chí không xấu.

my_json_string = json.dumps({'key1': val1, 'key2': val2})

21

Đã có một giải pháp được cung cấp cho phép xây dựng một từ điển, (hoặc từ điển lồng nhau cho dữ liệu phức tạp hơn), nhưng nếu bạn muốn xây dựng một đối tượng, thì có lẽ hãy thử 'ObjDict'. Điều này mang lại nhiều quyền kiểm soát hơn cho json được tạo ra, ví dụ như giữ lại trật tự và cho phép xây dựng như một đối tượng có thể là đại diện ưa thích cho khái niệm của bạn.

Pip cài đặt objdict đầu tiên.

from objdict import ObjDict

data = ObjDict()
data.key = 'value'
json_data = data.dumps()

2
điều này thật đúng với gì mà tôi đã tìm kiếm! Cho rằng các ký tự không có thứ tự, mặc dù bạn có thể sắp xếp theo thứ tự bảng chữ cái khi gọi json.dumpstức là json.dumps(response, sort_keys=True, indent=4), nhưng sau đó bạn bị mắc kẹt với thứ tự chữ cái và không phải là thứ tự, nhóm và đại diện ưa thích của bạn
Jonathan

11

Bạn có thể sử dụng EasyDictthư viện ( doc ) :

EasyDict cho phép truy cập các giá trị dict dưới dạng các thuộc tính (hoạt động theo cách đệ quy). Một ký hiệu dấu chấm giống như Javascript cho các ký tự python.

SỬ DỤNG

>>> from easydict import EasyDict as edict
>>> d = edict({'foo':3, 'bar':{'x':1, 'y':2}})
>>> d.foo
3
>>> d.bar.x
1

>>> d = edict(foo=3)
>>> d.foo
3

[ Cài đặt ]:

  • pip install easydict

Benyamin, bạn có thể vui lòng chỉnh sửa ví dụ của mình để hiển thị việc sử dụng với các lần đổ và tải JSON không?
Thom Ives

7

Tất cả các câu trả lời trước đây đều đúng, đây là một cách dễ dàng hơn để làm điều đó. Ví dụ: tạo cấu trúc dữ liệu Dict để tuần tự hóa và giải tuần tự hóa một đối tượng

( Lưu ý Không có gì là Null trong python và tôi cố tình sử dụng điều này để chứng minh làm thế nào bạn có thể lưu trữ null và chuyển đổi nó thành json null)

import json
print('serialization')
myDictObj = { "name":"John", "age":30, "car":None }
##convert object to json
serialized= json.dumps(myDictObj, sort_keys=True, indent=3)
print(serialized)
## now we are gonna convert json to object
deserialization=json.loads(serialized)
print(deserialization)

nhập mô tả hình ảnh ở đây

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.