通过字符串列表访问json数据?

时间:2017-05-23 19:10:58

标签: python arrays json python-2.7 dictionary

我有这个json:

json = {
    "state": {
        "reported": {
            "figure": {"x":10, "y":12, "z":12},
            "gif": {"x":10,"y":12, "z":12}
        }
    }
}

和这个字符串列表:

lista = ["json['state']['reported']['figure']['x']",
         "json['state']['reported']['figure']['y']",
         "json['state']['reported']['gif']['z']"]

我想知道是否有办法使用此列表获取json的结果?

2 个答案:

答案 0 :(得分:2)

正如另一个答案所指出的那样,你可以使用eval。甚至有一些技巧可以让黑客更难控制你的系统。这是迄今为止最简单的路线,然而,没有一种明确的方法可以使其真正安全。你玩的任何技巧都只会给你一种虚假的安全感。因此,如果您完全不信任lista的来源,请勿使用它。糟糕的事情会发生。

好消息是,如果您愿意编写(或复制/粘贴)更多代码,我们可以使用python的AST安全地执行此操作。诀窍是将字符串解析为AST。然后,我们将创建一个可以遍历AST并在找到某些类型的节点时采取适当(和安全)操作的类。在您的示例中,我们需要处理4种类型的节点:

  • Str:表示字符串文字。
  • Name:表示名称查找。例如json
  • Subscript:代表__getitem__来电。
  • Index:将传递给__getitem__的对象。一般来说,这也可能是一个切片 - 但这并不是你所展示的输入,所以我们暂时不会支持它。

您可能需要的其他类型的节点(取决于输入)是NumSlice。一旦你理解了ast reference(如果你之前没有看过它可能有点模糊,那么应该直接实现它们。)

现在编写我们的课程看起来非常简单:

class Evaluator(ast.NodeVisitor):
    def __init__(self, globals):
        self._globals = globals

    def visit_Str(self, n):
        return n.s

    def visit_Name(self, n):
        return self._globals[n.id]

    def visit_Subscript(self, n):
        item = self.visit(n.value)
        slce = self.visit(n.slice)
        return item[slce]

    def visit_Index(self, n):
        return self.visit(n.value)

    def visit_Expr(self, n):
        return self.visit(n.value)

在行动中,它看起来像:

e = Evaluator({'json': json})
print([e.visit(ast.parse(s).body[0]) for s in lista])

答案 1 :(得分:1)

您可以使用python的eval函数。话虽如此,这是一个非常糟糕的主意,因为eval是一个危险的功能。有关评估功能的更多信息,请查看此链接:https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html

json = {
    "state": {
        "reported": {
            "figure": {"x": 10, "y": 12, "z": 12},
            "gif": {"x": 10, "y": 12, "z": 12}
        }}}

lista = [
    "json['state']['reported']['figure']['x']",
    "json['state']['reported']['figure']['y']",
    "json['state']['reported']['gif']['z']"
]

values = [eval(x) for x in lista]