0

こんにちは、JSON Encoder を使用しています。pickle.dumps() で奇妙な出力が得られます。出力は次のようになります。

"cdecimal Decimal p0 (S'2097369' p1 tp2 Rp3 .",

一方、次のようにする必要があります。2097369

コード スニペットは次のとおりです。

class PythonObjectEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, (list, dict, unicode, int, float, str, bool, type(None))):
            return JSONEncoder.default(self, obj)
        return pickle.dumps(obj)

    def as_python_object(dct):
        if '_python_object' in dct:
            return pickle.loads('')
        return dct

何がうまくいかないのか、どうすれば目的の値を取り戻すことができるのか教えてもらえますか?

4

1 に答える 1

0

これがあなたが探しているものだと思います。JSON でサポートされていない型pickleは、Python オブジェクトであることを示す形式で文字列にシリアル化され、保存されます。Anobject_hookを使用してその形式を認識し、次の処理中に pickled オブジェクトを Python オブジェクトに変換しますjson.loads

from decimal import Decimal
import json
import pickle

class PythonObjectEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, (dict,list,tuple,str,unicode,int,long,float,bool,type(None))):
            return json.JSONEncoder.default(self,obj)
        return {'_python_object_':pickle.dumps(obj)}

def as_python_object(dct):
    if u'_python_object_' in dct:
        return pickle.loads(dct[u'_python_object_'])
    return dct

obj = {'a':1,'b':'string','c':1.2,'d':Decimal('123.456')}
print obj # original object
j = json.dumps(obj,cls=PythonObjectEncoder,indent=2)
print j  # encoded object
obj = json.loads(j,object_hook=as_python_object)
print obj # decoded object

出力:

{'a': 1, 'c': 1.2, 'b': 'string', 'd': Decimal('123.456')}
{
  "a": 1, 
  "c": 1.2, 
  "b": "string", 
  "d": {
    "_python_object_": "cdecimal\nDecimal\np0\n(S'123.456'\np1\ntp2\nRp3\n."
  }
}
{u'a': 1, u'c': 1.2, u'b': u'string', u'd': Decimal('123.456')}
于 2013-09-07T17:39:36.290 に答える