我有这个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的结果?
答案 0 :(得分:2)
正如另一个答案所指出的那样,你可以使用eval
。甚至有一些技巧可以让黑客更难控制你的系统。这是迄今为止最简单的路线,然而,没有一种明确的方法可以使其真正安全。你玩的任何技巧都只会给你一种虚假的安全感。因此,如果您完全不信任lista
的来源,请勿使用它。糟糕的事情会发生。
好消息是,如果您愿意编写(或复制/粘贴)更多代码,我们可以使用python的AST安全地执行此操作。诀窍是将字符串解析为AST。然后,我们将创建一个可以遍历AST并在找到某些类型的节点时采取适当(和安全)操作的类。在您的示例中,我们需要处理4种类型的节点:
Str
:表示字符串文字。Name
:表示名称查找。例如json
Subscript
:代表__getitem__
来电。Index
:将传递给__getitem__
的对象。一般来说,这也可能是一个切片 - 但这并不是你所展示的输入,所以我们暂时不会支持它。您可能需要的其他类型的节点(取决于输入)是Num
和Slice
。一旦你理解了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]