【问题标题】:convert json to object in python with numbers as key以数字为键将json转换为python中的对象
【发布时间】:2021-12-21 19:48:42
【问题描述】:

我是 python 新手,我有一个带有 int 作为键值的 json,例如:

"data": {
        "1": {
            "b": 1
} 
}

我想将它转换为对象:

x = json.loads(json.dumps(data, indent=4, sort_keys=True), object_hook=lambda d: SimpleNamespace(**d))

现在我想访问 b 。我该怎么做。此代码返回错误:

x.1.b

【问题讨论】:

  • 也许getattr(x, 1).b
  • 出现这个错误:TypeError: getattr(): attribute name must be string
  • 你为什么要这样做?为什么不直接使用普通字典(顺便说一下,是一个对象

标签: python json python-3.x


【解决方案1】:

我认为直接使用您的dict 会更容易。

data = {
    "1": {"b": 1} 
}

some_value = data["1"]["b"]

如果您想使用SimpleNamespace,您需要将1 替换为_1 之类的东西才能使用x._1.b 之类的东西,因为x.1.b 会引发语法错误。

这可以通过递归地将您的 dict 转换为 SimpleNamespace 对象并在所有以数字开头的键中插入 _ 来完成。

def dict_to_namespace(d):
    return SimpleNamespace(
        **{
            (f"_{k}" if k[0].isdecimal() else k): (
                dict_to_namespace(v) if isinstance(v, dict) else v
            )
            for k, v in d.items()
        }
    )

x = dict_to_namespace(data)
some_value = x._1.b

注意:如果您的 dict/json 键包含特殊字符(空格、破折号等),这将导致错误

【讨论】:

  • 谢谢。这是一个很好的做法。但我正在寻找是否有任何方法可以转换为对象
  • @alikamrani 实际上,dict 是一个对象,因为在 python 中几乎所有东西都是一个对象。
  • @alikamrani 一个字典是一个对象
【解决方案2】:

在 Python 中,变量不允许以数字开头。

getattr(x, "1").b

https://docs.python.org/3/library/functions.html#getattr

相关帖子: Can variable names in Python start with an integer?

【讨论】:

  • 发生此错误:TypeError: 'types.SimpleNamespace' object is not subscriptable
  • 我没有看到您试图将其转换为 types.SimpleNamespace。变量不允许以数字开头。虽然您仍然可以通过执行以下操作访问属性:getattr(x, "1")。不过,我建议将 json 保留为字典对象。
猜你喜欢
  • 2015-03-01
  • 2019-01-05
  • 2018-06-12
  • 2018-10-11
  • 2014-11-28
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多