Hướng dẫn python nested object to json - python lồng đối tượng vào json

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ướng dẫn python nested object to json - python lồng đối tượng vào json

Đã 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': <__main__.Identity instance at 0x1005317e8>}
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

{"abc": "{\"name\": \"abc name\"}"}
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

Đã 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

Hướng dẫn python nested object to json - python lồng đối tượng vào json

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\"}"}
0

Trong 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\"}"}
1

Giả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: https://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

    {"abc": "{\"name\": \"abc name\"}"}
    
    4

Hướng dẫn python nested object to json - python lồng đối tượng vào json

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

Hướng dẫn python nested object to json - python lồng đối tượng vào json

1

Bạn có thể làm tổ các vật thể trong JSON?

Các đối tượng có thể được lồng bên trong các đối tượng khác.Mỗi đối tượng lồng nhau phải có một đường dẫn truy cập duy nhất.Tên trường tương tự có thể xảy ra trong các đối tượng lồng nhau trong cùng một tài liệu.. Each nested object must have a unique access path. The same field name can occur in nested objects in the same document.

JSON có thể lồng mảng?

Các thuộc tính và dữ liệu sự kiện có thể chứa các giá trị lồng nhau (JSON), các đối tượng, đối tượng và mảng của các đối tượng.Bạn có thể sử dụng các giá trị lồng nhau này để phù hợp với mọi người trong các phân đoạn, bộ lọc và tiêu chí kích hoạt.—arrays, objects, and arrays of objects. You can use these nested values to match people in segments, filters, and trigger criteria.