JSON Pickle序列化对象列表

hxzsmxv2  于 11个月前  发布在  其他
关注(0)|答案(4)|浏览(123)

我想使用jsonpickle序列化一个对象列表。每个对象都包含一个对象列表:

class ImageManipulationConfiguration:
    region_list = []
    
    def to_json(self):
        return jsonpickle.encode(self.region_list, indent=4,
                                 separators=(',', ': '))

字符串
这里,region_list包含这个类的对象:

class ImageManipulationRegion:
    image_manipulation_element_list = []


image_manipulation_element_list内部,有继承这个类的类对象:

class ImageManipulationElement


当我调用我的to_json函数时,只有region_list中的顶级项被序列化,image_manipulation_element_list列表中的子对象不包括在内。有没有一种方法可以使用jsonpickle递归地包括所有内容?

gxwragnw

gxwragnw1#

答:
1.使用max_depth=4
1.并在下面更换分离器。

def to_json(self):
    return jsonpickle.encode(self.region_list, indent=4,
                                 separators=(', ', ': '),max_depth=4)

字符串
或者使用下面的代码。

class BoxHandler(jsonpickle.handlers.BaseHandler):
def flatten(self, obj, data):
    return [self.context.flatten(x,reset=False) for x in obj.contents]


Reference

yjghlzjz

yjghlzjz2#

是的,您可以使用jsonpickle.set_encoder_options函数为所有将来的编码设置分隔符和分隔符参数。

import jsonpickle
from jsonpickle.picklers.base import Pickler
from jsonpickle.util import encode

class ImageManipulationConfiguration:
region_list = []

 def to_json(self):
    return encode(self.region_list, Pickler, indent=4, separators=(',', ': '))

class ImageManipulationRegion:
image_manipulation_element_list = []

class ImageManipulationElement:
pass

jsonpickle.set_encoder_options('json', indent=4, separators=(',', ': '))

immc = ImageManipulationConfiguration()
immc.region_list.append(ImageManipulationRegion())
immc.region_list[0]. 
image_manipulation_element_list.append(ImageManipulationElement( 
   ))

 print(immc.to_json())

字符串
这将输出:

[
{
    "image_manipulation_element_list": [
        {
            "__setstate__": null
        }
    ]
}
]


image_manipulation_element_list中的子对象现在包含在编码的JSON中。

iyr7buue

iyr7buue3#

你可以在jsonpickle中使用unpicklable参数来递归地包含所有对象。当调用jsonpickle.encode来包含所有对象时,将unpicklable参数设置为True,即使是那些没有被顶级对象直接引用的对象。
以下是如何修改to_json方法:

import jsonpickle

class ImageManipulationConfiguration:
    region_list = []

    def to_json(self):
        return jsonpickle.encode(self.region_list, indent=4, separators=(',', ': '), unpicklable=True)

字符串
这应该包括region_list中的所有对象,包括image_manipulation_element_list中的子对象。

t5zmwmid

t5zmwmid4#

是的,你可以使用jsonpickle实现对象的递归序列化,方法是为每个类定制序列化过程。为此,你需要为每个类定义一个定制处理程序,指定如何序列化它的示例及其嵌套对象。
下面是如何为类实现这一点:
为每个类定义自定义处理程序:

import jsonpickle

class ImageManipulationConfiguration:
    region_list = []

    def to_json(self):
        return jsonpickle.encode(self.region_list, indent=4, separators=(',', ': '))

class ImageManipulationRegion:
    image_manipulation_element_list = []

class ImageManipulationElement:
    pass

def encode_ImageManipulationConfiguration(obj):
    return {
        'region_list': obj.region_list
    }

def encode_ImageManipulationRegion(obj):
    return {
        'image_manipulation_element_list': obj.image_manipulation_element_list
    }

def encode_ImageManipulationElement(obj):
    # Define how to serialize ImageManipulationElement objects if needed
    pass

# Register custom handlers
jsonpickle.handlers.registry.register(ImageManipulationConfiguration, encode_ImageManipulationConfiguration)
jsonpickle.handlers.registry.register(ImageManipulationRegion, encode_ImageManipulationRegion)
jsonpickle.handlers.registry.register(ImageManipulationElement, encode_ImageManipulationElement)

字符串
现在,当您在ImageManipulationConfiguration的示例上调用to_json时,它将包含每个类的自定义序列化逻辑:

config = ImageManipulationConfiguration()
# Populate config.region_list with instances of ImageManipulationRegion and nested ImageManipulationElement objects

json_string = config.to_json()
print(json_string)


通过为每个类提供自定义的序列化逻辑,可以确保在调用to_json时嵌套对象被正确序列化。这允许您使用jsonpickle实现递归序列化。

相关问题