从JSON加载类变量?

时间:2012-09-22 01:34:01

标签: python json python-2.7

我有一个类,我将从JSON行中实例化很多。类似的东西:

class Something:
    def __init__(self, json):
        #load all self variables from simplejson.loads(json) here
        print self.some_variable_loaded_from_json

我希望这个效率尽可能高,因为这个类每秒加载数百次。我知道我可以在从simplejson生成的字典中使用键/值对执行for循环,但是如果有一种方法可以让simplejson直接加载到没有O(n)开销的类变量,那就太棒了。

2 个答案:

答案 0 :(得分:9)

如果您只是将JSON数据加载到Python对象中,只需将相关字典传递给__init__方法 - 您可以使用传入的字典覆盖实例__dict__

>>> import json
>>> json_data =  '{"a": "my data"}'
>>> data = json.loads(json_data)
>>> class AutoVar(object):
...   def __init__(self, data):
...       self.__dict__ = data
... 
>>> test = AutoVar(data)
>>> test.a
u'my data'

答案 1 :(得分:2)

您将不得不加载一次数据并保持缓存,或者在Something的每个实例化上循环遍历整个JSON blob。不幸的是,SimpleJson不维护“对象缓存”或类似的东西(Python中也没有任何其他JSON库)。要从JSON blob中再次获取数据,您必须重新解析blob本身(或文件,无论它是什么)。

我可能建议您将这些变量从JSON添加到而不是每个实例,并且仅在必要时添加。例如:

class Something(object):
    @classmethod
    def _load_from_json(cls, blob):
        for k, v in blob.iteritems():
            setattr(cls, k, v)

_load_from_json的调用将相对昂贵,但只要JSON本身发生更改,您就必须这样做,然后Something的所有实例都将具有类似属性的数据访问权限。

在类似的说明中,如果您在这里查看文件,我最近发布了一个允许对YAML文件进行实时对象访问的要点(尽管您实际上可以换出yaml代码中的json)。它可能会做你想要的。