2016-03-23 7 views
1

私は、なぜそれが起こっているのか理解できない奇妙なシリアライズ "エフェクト"が発生しています。python jsonオブジェクトのシリアル化の奇妙な結果

基本的に、1つのプロパティが期待どおりに表されており、別のプロパティが実際には表示されていません。 たとえば、以下のテストに基づいて、 {"source_system": "ABC"、 "target_system": "DEF"} ではなく、 {"source_system": "ABC"、 "target_system" : "DEF"}

source_systemの1つのタプルがタプルだとは思えますが、なぜ私は目が見えないのでしょうか。

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() 

例に示すように、私はjsonpickleと同様に、JSONライブラリーと同じ結果を取得し、その結果は次のとおりです。

{ 
    "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はタプルだと思うんやそれを入れ[]リスト括弧内に?そして、なぜ両方のプロパティを処理/直列化しないのですか?

+0

これは奇妙です。クラス定義をコピーして貼り付け、名前を変更しました。同じ結果です。 **その後、私はクラスdefをタイプし直し、期待どおりに動作します**。おそらく奇妙な文字か???私は自明ではなかった。 – user1289330

+4

'self.source_system = _source_system'行の最後にコンマがあります。削除されると結果はあなたが期待するものです – finmor

+0

フィンモールありがとう - 私の人生のために、私はそのコンマを見ることができませんでした!最初に正しい答えがあったように見えますが、答えではなくコメントでコメントをしたので、あなたに信用を与える方法がわからない、またはNikitaに答えのクレジットを与えなければならないかどうかわかります – bbaley

答えて

0

self.source_system = _source_system, 

末尾にコンマがあるのでself.source_systemタプルです。

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) 

カンマをご__init___source_systemが1組になり、したがって、それは、JavaScriptの配列に変換された後に(彼はただ説明するためにここに、答えに地雷を彼のコメントを行います。可能性があります)。 self.source_system = _source_system,self.source_system = (_source_system,)と同じです。