将json转换为python obj

时间:2018-06-26 12:54:06

标签: python json

我想将已解析的json数据转换为python对象。

这是我的json格式:

{
   "Input":{
      "filename":"abg.png",
      "fileSize":123456
   },
   "Output":{
      "filename":"img.png",
      "fileSize":1222,
      "Rect":[
         {
            "x":34,
            "y":51,
            "width":100,
            "height":100
         },
         {
            "x":14,
            "y":40,
            "width":4,
            "height":6
         }]
   }
}   

我试图创建一个名为Region的类

class Region:
    def __init__(self, x, y, width, height):
        self.x=x
        self.y=y
        self.width=width
        self.height=height

    def __str__(self):
        return '{{"x"={1}, "y"={2}, "width"={3}, "height"={4}}'.format(self.left, self.top, self.width, self.height)

def obj_creator(d):
    return Region(d['x'], d['y'], d['width'], d['height'])

然后我尝试使用object_hook函数将数据加载到对象中

for item in data['Output']['Rect']:
    region = json.loads(item, object_hook=obj_creator)

但是我发现它说了这个错误

TypeError: the JSON object must be str, bytes or bytearray, not 'dict'

实际上,如果我的数据未嵌套,我知道如何将对象分配给python对象。但是我无法使用嵌套的json数据执行此操作。有什么建议吗?

谢谢。

1 个答案:

答案 0 :(得分:5)

看起来您的JSON实际上是字典。

由于dict属性和实例属性具有相同的名称,因此可以轻松地创建Region的实例,方法是将dict item与两个**拆包:

regions = []
for item in data['Output']['Rect']:
    regions.append( Region(**item) )
for region in regions:
    print( region )

输出:

{"x"=34, "y"=51, "width"=100, "height"=100}
{"x"=14, "y"=40, "width"=4, "height"=6}

(我将您的__str__更改为:)

def __str__(self):
    return '{{"x"={}, "y"={}, "width"={}, "height"={}}}'.format(self.x, self.y, self.width, self.height)