从json创建python对象

时间:2019-01-08 08:43:21

标签: python json

我有带有此类信息的json文件

{
  "cars" : [{
    "model" : " BMW",
    "gas" : 100,
  },
  {
    "model" : "LADA",
    "gas" : 150
  },
  {
    "model" : "SUZUKI",
    "gas" : 70
  }]
}

及以下课程

class GasCar(Car):
    def __init__(self, model=None, gas=None):
        super(GasCar, self).__init__()
        self.gas = gas
        self.model = model

如何创建类对象并将数据从json传输到类实例?

我尝试过

car = GasCar()
s = json.dumps(car)
s = json.dumps(car.__dict__)

3 个答案:

答案 0 :(得分:1)

由于json中的结尾逗号,因此Python 100,模块无法解析您的JSON,如果要解决此问题,可以参考this答案。 但是,假设json如下:

import json
class GasCar():
    def __init__(self, model=None, gas=None):
        super(GasCar, self).__init__()
        self.gas = gas
        self.model = model

cars = """{
  "cars" : [{
    "model" : "BMW",
    "gas" : 100
  },
  {
    "model" : "LADA",
    "gas" : 150
  },
  {
    "model" : "SUZUKI",
    "gas" : 70
  }]
}"""

json_cars = json.loads(cars)
cars = json_cars["cars"] # gets "cars" list

您可以这样创建汽车对象:

car_object1 = GasCar(cars[0]["model"], cars[0]["gas"])
print(car_object1.model) # prints "BMW"

或者如果您想要所有汽车的清单:

car_objects = [GasCar(car["model"], car["gas"]) for car in cars]

答案 1 :(得分:0)

您可以使用json.loadsDocs)将JSON对象读入字典,然后将字典作为构造函数传递给您的类。让我知道是否需要更多说明。

答案 2 :(得分:0)

我喜欢一种更通用的方式来完成这项工作。快速地将python对象粘合在一起,并将它们序列化为json,反之亦然,得到一个JSON字符串,然后从中创建一个“ Value-Container”对象(没有方法等)-我想知道程序员如何在没有:-)的情况下生活? / p>

也许不是世界上最好的代码,请提出您的建议,但我现在已经这样做了7年(也可以在jython中运行,性能也可以): (请调试以最后查看“ po1”的结构):

# coding: UTF-8

import json

import types

def obj2dict(pp):
    if type(pp) is types.TupleType:
        olist=[]
        for p in pp:
            olist.append(obj2dict(p))
        return tuple(olist)
    if type(pp) is types.ListType:
        olist=[]
        for p in pp:
            olist.append(obj2dict(p))
        return olist

    if type(pp) is types.DictionaryType:
        odict={}
        for k,val in pp.items():
            odict[k]=obj2dict(val)
        return odict
    if type(pp) is types.InstanceType:
        odict={}
        for m in pp.__dict__:
            val=getattr(pp,m)
            odict[m]=obj2dict(val)
        return odict

        for m in dir(pp):
            if not m.startswith("_"): 
                val=getattr(pp,m)
                odict[m]=obj2dict(val)
        return odict
    return pp

class CONT:pass

def toFloat(inp):
    return float(inp.replace(",",".")) 


def dict2obj(pp):
    if type(pp) is types.ListType:
        olist=[]
        for p in pp:
            olist.append(dict2obj(p))
        return olist
    if type(pp) is types.DictionaryType:
        oinst=CONT()
        for (k,v) in pp.items():
            val=dict2obj(v)
            setattr(oinst,k,val)
        return oinst
    try:
        pp=toFloat(pp)
    except:pass
    return pp

def dumps(pp):
    return json.dumps(obj2dict(pp)) #,ensure_ascii=False)
def loads(pp):
    return dict2obj(json.loads(pp))  #,ensure_ascii=False))


if __name__ == "__main__":
    jstring="""{
  "cars" : [{
    "model" : " BMW",
    "gas" : 100
  },
  {
    "model" : "LADA",
    "gas" : 150
  },
  {
    "model" : "SUZUKI",
    "gas" : 70
  }]
}"""
    po1=loads(jstring)
    po=CONT()
    po.model="Toyota"
    po.gas=88
    print dumps(po)
相关问题