Tôi muốn mã hóa các đối tượng trong JSON. Nhưng, tôi không thể tìm ra cách tạo đầu ra mà không cần chuỗi thoát.
import json
class Abc:
def __init__[self]:
self.name="abc name"
def toJSON[self]:
return json.dumps[self.__dict__, cls=ComplexEncoder]
class Doc:
def __init__[self]:
self.abc=Abc[]
def toJSON[self]:
return json.dumps[self.__dict__, cls=ComplexEncoder]
class ComplexEncoder[json.JSONEncoder]:
def default[self, obj]:
if isinstance[obj, Abc] or isinstance[obj, Doc]:
return obj.toJSON[]
else:
return json.JSONEncoder.default[self, obj]
doc=Doc[]
print doc.toJSON[]
Kết quả là [các bãi rác trả về một đại diện chuỗi, đó là lý do tại sao "được thoát ra]
{"abc": "{\"name\": \"abc name\"}"}
Tôi muốn một cái gì đó khác biệt một chút. Kết quả dự kiến là
{"abc": {"name": "abc name"}"}
Nhưng tôi không thấy làm thế nào để ... bất kỳ gợi ý nào?
cảm ơn trước.
Đã hỏi ngày 1 tháng 3 năm 2011 lúc 20:40Mar 1, 2011 at 20:40
Fred Laurentfred LaurentFred Laurent
1.4971 Huy hiệu vàng12 Huy hiệu bạc13 Huy hiệu đồng1 gold badge12 silver badges13 bronze badges
1
Mẫu trước đây của tôi, với một đối tượng lồng nhau khác và lời khuyên của bạn:
import json
class Identity:
def __init__[self]:
self.name="abc name"
self.first="abc first"
self.addr=Addr[]
def reprJSON[self]:
return dict[name=self.name, firstname=self.first, address=self.addr]
class Addr:
def __init__[self]:
self.street="sesame street"
self.zip="13000"
def reprJSON[self]:
return dict[street=self.street, zip=self.zip]
class Doc:
def __init__[self]:
self.identity=Identity[]
self.data="all data"
def reprJSON[self]:
return dict[id=self.identity, data=self.data]
class ComplexEncoder[json.JSONEncoder]:
def default[self, obj]:
if hasattr[obj,'reprJSON']:
return obj.reprJSON[]
else:
return json.JSONEncoder.default[self, obj]
doc=Doc[]
print "Str representation"
print doc.reprJSON[]
print "Full JSON"
print json.dumps[doc.reprJSON[], cls=ComplexEncoder]
print "Partial JSON"
print json.dumps[doc.identity.addr.reprJSON[], cls=ComplexEncoder]
tạo ra kết quả dự kiến:
Str representation
{'data': 'all data', 'id': }
Full JSON
{"data": "all data", "id": {"name": "abc name", "firstname": "abc first", "address": {"street": "sesame street", "zip": "13000"}}}
Partial JSON
{"street": "sesame street", "zip": "13000"}
Thanks.
Đã trả lời ngày 2 tháng 3 năm 2011 lúc 9:14Mar 2, 2011 at 9:14
Fred Laurentfred LaurentFred Laurent
1.4971 Huy hiệu vàng12 Huy hiệu bạc13 Huy hiệu đồng1 gold badge12 silver badges13 bronze badges
1
Mẫu trước đây của tôi, với một đối tượng lồng nhau khác và lời khuyên của bạn:
tạo ra kết quả dự kiến:
Đã trả lời ngày 2 tháng 3 năm 2011 lúc 9:14
import json
class Abc:
def __init__[self]:
self.name="abc name"
def jsonable[self]:
return self.name
class Doc:
def __init__[self]:
self.abc=Abc[]
def jsonable[self]:
return self.__dict__
def ComplexHandler[Obj]:
if hasattr[Obj, 'jsonable']:
return Obj.jsonable[]
else:
raise TypeError, 'Object of type %s with value of %s is not JSON serializable' % [type[Obj], repr[Obj]]
doc=Doc[]
print json.dumps[doc, default=ComplexHandler]
Vì vậy, vấn đề ngay lập tức là bạn đang chuyển mô -đun JSON một giá trị JSON, sẽ được mã hóa dưới dạng một chuỗi khác trong giá trị JSON.
~$ python nestjson.py
{"abc": "abc name"}
~$
Vấn đề rộng hơn là bạn rất nhiều điều này.
Dựa trên JSON DateTime giữa Python và JavaScript, tôi sẽ đi với một cái gì đó gần gũi hơn với điều này:Mar 1, 2011 at 21:00
cái nào có được bạn:Nicholas Knight
Điều này có thể được làm cho sạch hơn/saner/an toàn hơn [đặc biệt, chỉ cần lấy
5 nói chung không phải là một điều nên làm bên ngoài gỡ lỗi/khắc phục sự cố], nhưng nó sẽ có được điểm. Tất cả những gì bạn cần, về cơ bản, là một cách để có được một đối tượng tương thích với JSON [cho dù đó là một chuỗi hoặc số đơn giản, hoặc một danh sách hoặc chỉ ra] ra khỏi mỗi "nút" trong cây. Đối tượng đó không nên là một đối tượng đã xuất sắc, đó là những gì bạn đang làm.4 gold badges44 silver badges56 bronze badges{"abc": "{\"name\": \"abc name\"}"}
Đã trả lời ngày 1 tháng 3 năm 2011 lúc 21:00
import datetime
import decimal
class Jsonable[object]:
def __iter__[self]:
for attr, value in self.__dict__.iteritems[]:
if isinstance[value, datetime.datetime]:
iso = value.isoformat[]
yield attr, iso
elif isinstance[value, decimal.Decimal]:
yield attr, str[value]
elif[hasattr[value, '__iter__']]:
if[hasattr[value, 'pop']]:
a = []
for subval in value:
if[hasattr[subval, '__iter__']]:
a.append[dict[subval]]
else:
a.append[subval]
yield attr, a
else:
yield attr, dict[value]
else:
yield attr, value
class Identity[Jsonable]:
def __init__[self]:
self.name="abc name"
self.first="abc first"
self.addr=Addr[]
class Addr[Jsonable]:
def __init__[self]:
self.street="sesame street"
self.zip="13000"
class Doc[Jsonable]:
def __init__[self]:
self.identity=Identity[]
self.data="all data"
def main[]:
doc=Doc[]
print "-Dictionary- \n"
print dict[doc]
print "\n-JSON- \n"
print json.dumps[dict[doc], sort_keys=True, indent=4]
if __name__ == '__main__':
main[]
Nicholas Knightnicholas Knight
-Dictionary-
{'data': 'all data', 'identity': {'first': 'abc first', 'addr': {'street': 'sesame street', 'zip': '13000'}, 'name': 'abc name'}}
-JSON-
{
"data": "all data",
"identity": {
"addr": {
"street": "sesame street",
"zip": "13000"
},
"first": "abc first",
"name": "abc name"
}
}
15.6K4 Huy hiệu vàng44 Huy hiệu bạc56 Huy hiệu Đồng
Để tránh sự lặp lại của mã như trong câu trả lời của Fred Laurent, tôi đã quá tải phương thức
{"abc": "{\"name\": \"abc name\"}"}
6 như sau. Điều này cũng cho phép 'Jsonize' Liệt kê các yếu tố, DateTime và Decimal không có phụ thuộc bổ sung, chỉ cần sử dụng Dict [].Jan 31, 2015 at 16:11
1
Đầu ra:
Hy vọng nó giúp! Cảm ơn
Đã trả lời ngày 31 tháng 1 năm 2015 lúc 16:11
import json
class Abc[object]:
def __init__[self]:
self.name = "abc name"
class Doc[object]:
def __init__[self]:
self.abc = Abc[]
doc = Doc[]
# Serialization
json_data = json.dumps[doc, default=lambda o: o.__dict__]
print[json_data]
Mặc dù tất cả các giải pháp khác tôi cho rằng chúng hoạt động, tôi thấy chúng có nhiều mã nồi hơi, khi mục tiêu chỉ là mã hóa các đối tượng Python lồng nhau.
{"abc": "{\"name\": \"abc name\"}"}
0Trong một bài viết, tôi đã tìm thấy một giải pháp thanh lịch, thực hiện chính xác những gì bạn đã yêu cầu nhưng không có mã nồi hơi. Vì bạn thậm chí có thể có phần khử tự động hóa miễn phí, tôi sẽ chỉ cho bạn một giải pháp trước cho câu hỏi chính xác của bạn và sau đó đưa ra một phiên bản sạch hơn, nơi việc khử tự động cũng sẽ hoạt động.
{"abc": "{\"name\": \"abc name\"}"}
1Giải pháp chính xác cho câu hỏi của bạn
{"abc": "{\"name\": \"abc name\"}"}
2Điều này sẽ xuất hiện chính xác những gì bạn yêu cầu:
Giải pháp thanh lịch hơn để cho phép tuần tự hóa và khử dung dịchAug 26, 2021 at 8:42
ced-mosced-mosced-mos
Điều này sẽ xuất hiện như sau:1 silver badge7 bronze badges
2
Toàn bộ phép thuật hoạt động bằng cách xác định hàm Lambda mặc định:
{"abc": "{\"name\": \"abc name\"}"}
7.{"abc": "{\"name\": \"abc name\"}"}
3Đã trả lời ngày 26 tháng 8 năm 2021 lúc 8:42
1581 Huy hiệu bạc7 Huy hiệu đồngApr 20, 2012 at 23:28
Tôi không thể thêm điều này như một nhận xét và thêm như câu trả lời. Mẫu cuối cùng của Fred rất hữu ích cho tôi. Tôi được cho biết JsonPickle thực hiện điều này, nhưng không thể khiến mô -đun cài đặt và chạy đúng. Vì vậy, sử dụng mã ở đây. Mặc dù điều chỉnh nhỏ, tôi đã có quá nhiều biến để thêm bằng tay vào một số đối tượng. Vì vậy, vòng lặp nhỏ này đơn giản hóa những điều:ferhan
Nó có thể được sử dụng trong bất kỳ đối tượng nào có một lớp con quá bận rộn để mã hóa bằng tay. Hoặc có thể được làm một người trợ giúp cho tất cả các lớp. Điều này cũng hoạt động cho bản trình bày JSON đầy đủ của các mảng thành viên có chứa các lớp khác [miễn là tất nhiên họ thực hiện reprjson []].2 gold badges13 silver badges9 bronze badges
2
Đã trả lời ngày 20 tháng 4 năm 2012 lúc 23:28
Ferhanferhan
2.5492 Huy hiệu vàng13 Huy hiệu bạc9 Huy hiệu đồngSep 19, 2014 at 0:40
Đây là những gì bạn đang tìm kiếm: //github.com/jsonpickle/jsonpickleveegee
Nó làm nối tiếp các đối tượng Python và có thể dễ dàng được mở rộng để tuần tự hóa các loại tùy chỉnh.5 silver badges5 bronze badges
1
Đã trả lời ngày 19 tháng 9 năm 2014 lúc 0:40jsons, it was published in 2022.
VeegeeveEgee
3595 Huy hiệu bạc5 Huy hiệu Đồng
Để tuần tự hóa phức tạp hơn, tôi sẽ sử dụng Jsons, nó đã được xuất bản vào năm 2022.
Biến các đối tượng Python thành các chuỗi và [JSON] và trở lại
4{"abc": "{\"name\": \"abc name\"}"}
Không có thay đổi nào được yêu cầu đối với đối tượng của bạn
Dễ dàng tùy chỉnh và có thể mở rộng1 gold badge9 silver badges25 bronze badges
Làm việc với các lớp dữ liệu, attrs và poposMar 2 at 20:08
1