【问题标题】:jsonpickle adds leading underscore to python object propertiesjsonpickle 为 python 对象属性添加前导下划线
【发布时间】:2018-11-27 06:17:21
【问题描述】:

我正在使用 jsonpickle 将嵌套的 python 对象转换为 json。 Python类:

class Cvideo:
    def __init__(self):
        self._url = None

    @property
    def url(self):
        return self._url

    @url.setter
    def url(self, value):
        self._url = value

序列化模块:

def create_jason_request(self, vid1: Cvideo):
    vid1 = Cvideo()
    vid1.url = entry['uploader_url'] # will get a leading underscore
    vid1.notdefinedproperty = "test" # wont get a leading underscore in json

    return jsonpickle.encode(vid, unpicklable=False)

不幸的是,创建的 json 描述的是 _url 而不是 url。使用 pythin 属性时如何避免在 json 中创建前导下划线?谢谢。

【问题讨论】:

    标签: python jsonpickle


    【解决方案1】:

    这是完全正常的行为。您的实例 state 被存储,而不是外部 API。属性不是状态的一部分,它们仍然是方法,因此是 API 的一部分。

    如果您必须将 url 存储在 JSON 结果中,则使用 __getstate__ method 返回一个能够更好地反映您的状态的字典。您必须创建一个匹配的 __setstate__ 方法:

    def __getstate__(self):
        return {'url': self._url}
    
    def __setstate__(self, state):
        self._url = state.get('url')
    

    【讨论】:

    • 非常感谢。这使我能够指导 JSON 结果的创建。稍微说明一下:我调用 __getstate__(self) 中的属性,例如 return {'url' self.url},因为属性封装了逻辑以提供适当的值。有什么设计考虑吗?
    • @wuz:没关系,只要考虑到这是您将返回到__setstate__ 的值。
    • 再次感谢您的帮助。您是否还知道如何序列化日期属性。不幸的是,用 strptime 修改 getstate 不会导致 json 日期映射:- 'upload_date': datetime.datetime.strptime(self.upload_date, "%Y%m%d"),
    • @wuz:什么是 JSON 日期映射? JSON 没有日期的概念。 jsonpickle datetime to readable json format 有帮助吗?
    • 感谢您的提示。为了使序列化的 json 能够启用 elasticsearch 自动日期映射,日期必须匹配精确的格式(例如 yyyy-mm-dd 没有 hh-mm-ss),一切都解决了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多