对于json结果中的每个对象,如何创建对象和分配对象属性

时间:2019-01-11 14:47:18

标签: python

class Device(object):
    data = None

    def __init__(self, properties):
        self.data = json.loads(properties)
        pass

这是我的设备类,我想使用python中的循环将属性分配给由Json结果创建的对象。我的设备属性为'description' 'device_type','facility','id','latitude','longitude','sequence','source','update_date','web_url'

1 个答案:

答案 0 :(得分:0)

有多种方法可以实现此目的。首先是使用setattr方法:

other_properties = {'device_type': "usb", 'id', '12345'} # and on and on

d = Device(properties=some_properties)

for k, v in other_properties.items():
    setattr(d, k, v) # this will set d.<key> = value

这相对简单易读,但是有些人可能会抱怨在self之外设置__init__属性。

接下来,您可以像以前一样将属性作为dict传递,并在__init__中解压缩它们:

class Device:
    def __init__(self, **properties):
        for k, v in properties.items():
            setattr(self, k, v) # again using setattr

或者,如果您已经知道该项目的词典是什么,则可以提前在__init__上设置关键字args并以这种方式解包

class Device:
    def __init__(self, id=None, device_type=None, latitude=None): # ad nauseum
        self.id = id
        self.device_type = device_type
        ...

d = Device(**properties) # This syntax will unpack properties into the correct keyword args

另一种方法可能是在update上调用Device.__dict__,尽管对于为什么 not 这么做有肯定的论点

class Device:
    def __init__(self, properties):
        self.__dict__.update(properties)

最后,问题可能会提出:“您甚至需要在这里上课吗?”如果您只想存储键值对,则可以使用dict并仅使用dict样式的访问范例:

d = {**properties}
d.get('id') # 12345

或者,如果您希望访问类样式,则可以使用namedtuple

from collections import namedtuple

Device = namedtuple("Device", ['id', 'device_type', ...]) # Your other kwargs go here

d = Device(**properties)
d.id # 12345

要创建许多类/命名元组实例,可以使用列表理解或for循环来实现

For循环:

devices = []
for properties in records: # Where records is a list of json properties
    devices.append(Device(**properties))

列表理解

devices = [Device(**properties) for properties in records

编辑:使用json

上面的代码假定properties的行为类似于dictionary**的解压缩将使用字典并将其解压缩为函数定义中正确的关键字参数。如果您传递的是string,则将无法使用,这就是使用json模块的原因。

json.loadsstring对象解析为python对象类型。例如:

import json

r = json.loads('["a", "b", "c"]')
# listType ['a', 'b', 'c']
# r is a list object containing the strings 'a', 'b', 'c'

最常用于从json格式的字符串返回字典

mystr = '''
{ "id": 12345,
  "device_type": "usb",
  "loc": "abc12345"}'''

my_obj = json.loads(mystr)
# my_obj is a dict now

要将其与您在问题中定义的内容放在一起,假设您有一个json_string property,并且想要像上面所做的那样将其加载到class中。首先使用您的方法:

class Device:
    def __init__(self, property_string):
        properties = json.loads(property_string)
        for k, v in properties.items():
            setattr(self, k, v)

要使用我上面概述的方法,您只需进行json.loads调用,并在类的外部 进行:

class Device:
    def __init__(self, id=None, device_type=None, ...): # all of your attrs go there
         self.id = id
         self.device_type = device_type
         ... # more of the same here

properties = json.loads(property_string)
d = Device(**properties)