4

JSONEncoder と JSONDecoder があります。

class SimpleTargetJSONEncoder(json.JSONEncoder):
    """
    converts a SimpleTarget to a Dict so it can be JSONified
    """

    def default(self, o):
        if isinstance(o, SimpleTargetItem):
            return {
                'x': o.x(),
                'y': o.y(),
                'status': o.status,
                'imageSet': o.imageSet}


class SimpleTargetJSONDecoder(json.JSONDecoder):
    def __init__(self):
        json.JSONDecoder.__init__(self, object_hook=self.dict_to_object)

    def dict_to_object(self, d):
        t = SimpleTargetItem(imageSet=d['imageSet'])
        t.setX(d['x'])
        t.setY(d['y'])
        return t

エンコーダーは、次のようなファイルを書き出します。

[
    {
        "y": 2514.0, 
        "x": 2399.0, 
        "status": "default", 
        "imageSet": {
            "default": ":/images/blue-circle.png", 
            "active": ":/images/green-circle.png", 
            "removed": ":/images/black-circle.png", 
        }
    }, 
    {
        "y": 2360.0, 
        "x": 2404.0, 
        "status": "default", 
        "imageSet": {
            "default": ":/images/blue-square.png", 
            "active": ":/images/green-square.png", 
            "removed": ":/images/black-square.png", 
        }
    }
]

しかし、デコーダーを呼び出すと、次のようになります。

/Library/Frameworks/Python.framework/Versions/2.7/bin/python /Users/dmd/Documents/inmotion/py/targetlayoutdesigner/designer.py
Traceback (most recent call last):
  File "/Users/dmd/Documents/inmotion/py/targetlayoutdesigner/targetlayoutwindow.py", line 131, in loadLayout
    for t in SimpleTargetJSONDecoder().decode(open(fname).read()):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 382, in raw_decode
    obj, end = self.scan_once(s, idx)
  File "/Users/dmd/Documents/inmotion/py/targetlayoutdesigner/targetitem.py", line 113, in dict_to_object
    t = SimpleTargetItem(imageSet=d['imageSet'])
KeyError: 'imageSet'

そして、その時点で d を見ると、d は次のようになります。

{u'active': u':/images/green-circle.png',
 u'default': u':/images/blue-circle.png',
 u'removed': u':/images/black-circle.png'}

つまり、内部辞書です。

私は何を間違っていますか?

4

1 に答える 1

4

すべての辞書ではなく、必要な辞書のみを取得すると想定しています。

class SimpleTargetJSONDecoder(json.JSONDecoder):
    def __init__(self):
        json.JSONDecoder.__init__(self, object_hook=self.dict_to_object)

    def dict_to_object(self, d):
        if 'x' not in d or 'y' not in d:
            return d
        t = SimpleTargetItem(imageSet=d['imageSet'])
        t.setX(d['x'])
        t.setY(d['y'])
        return t
于 2012-07-16T15:59:19.630 に答える