python json对象序列化奇怪的结果

时间:2016-03-23 17:27:05

标签: python json serialization

我正在经历一个奇怪的序列化"效果"我无法弄清楚为什么会这样。

基本上,一个属性按预期表示,另一个属性不表示。 例如,根据下面的测试,我希望得到: {" source_system":" ABC"," target_system":" DEF"} 不 {" source_system":[" ABC"]," target_system":" DEF"}

似乎认为一个属性source_system是一个元组,但我无法弄清楚为什么......可能我是盲人。

我使用json库得到与jsonpickle相同的结果,如示例

所示
import json
import jsonpickle

class testclass(object):
    def __init__(self,
                 _source_system = "",
                 _target_system = ""
                 ):

        self.source_system = _source_system,
        self.target_system = _target_system

    def to_JSON(self):
        return json.dumps(self, default=lambda o: o.__dict__, sort_keys=True, indent=4)    
        # return jsonpickle.encode(self, unpicklable=False)   


def main():
    test = testclass(_source_system = 'ABC', _target_system='DEF')

    print(test.to_JSON())                 
    print(jsonpickle.encode(test, unpicklable=False))
    print(jsonpickle.encode(test))

#============================================================================
if __name__ == '__main__':
    main()

结果是:

{
    "source_system": [
        "ABC"
    ], 
    "target_system": "DEF"
}
{"source_system": ["ABC"], "target_system": "DEF"}
{"py/object": "__main__.testclass", "source_system": {"py/tuple": ["ABC"]}, "target_system": "DEF"}

为什么它认为source_system是一个元组并将其放在[]列表括号中?而且,为什么两个属性都不被处理/序列化?

2 个答案:

答案 0 :(得分:0)

该行

self.source_system = _source_system,

有一个逗号,因此self.source_system 是一个元组。

答案 1 :(得分:0)

@fimnor 所述,删除__init__函数中的逗号应该可以解决问题。 (可能他会在答案中发表评论,我的这里只是为了解释。)

class testclass(object):
    def __init__(self,
             _source_system = "",
             _target_system = ""
             ):

    self.source_system = _source_system,
    self.target_system = _target_system

def to_JSON(self):
    return json.dumps(self, default=lambda o: o.__dict__, sort_keys=True, indent=4)    
    # return jsonpickle.encode(self, unpicklable=False)

_source_system__init__之后的逗号使其成为一个元组,因此它将转换为JavaScript数组。 self.source_system = _source_system,self.source_system = (_source_system,)相同。