Python:使用嵌入式 Javascript 常量/变量解析 JSON 字符串
Python: Parse JSON string with embedded Javascript constants/variables
如何解析嵌入了Javascript常量或变量的JSON字符串?
例如,如何解析像这样的 JSON 字符串?
{
"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{
"value": "New",
"onclick": Handlers.NEW
},
{
"value": "Open",
"onclick": Handlers.OPEN
},
{
"value": "Custom",
"onclick": "function(){doSomething(Handlers.OPEN);}"
}
]
}
}
}
当然,所有验证者都认为JSON是无效的,但是在定义了相应的Javascript对象的上下文中进行评估时,它是完全有效的。
首先想到的是先对字符串进行预处理,然后再将其提供给 JSON 解析器,但这很棘手,因为相同的字符串可能发生在现有字符串中(如示例 JSON 所示),并且需要一些正则表达式摆弄才能可靠地检测是否例如 Handlers.NEW
用作未修饰的值,或在现有字符串值内使用。
有没有一种干净的方法来处理这个用例,而无需进行手动正则表达式替换?
您可以使用 ast-module:
import ast
data = """{
"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{
"value": "New",
"onclick": Handlers.NEW
},
{
"value": "Open",
"onclick": Handlers.OPEN
},
{
"value": "Custom",
"onclick": "function(){doSomething(Handlers.OPEN);}"
}
]
}
}
}"""
def transform(item):
if isinstance(item, ast.Dict):
return dict(zip(map(transform,item.keys), map(transform, item.values)))
elif isinstance(item, ast.List):
return map(transform, item.elts)
elif isinstance(item, ast.Str):
return item.s
else:
return item
print transform(ast.parse(data).body[0].value)
import ast
s="""{
"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{
"value": "New",
"onclick": Handlers.NEW
},
{
"value": "Open",
"onclick": Handlers.OPEN
},
{
"value": "Custom",
"onclick": "function(){doSomething(Handlers.OPEN);}"
}
]
}
}
}"""
def evaluate(obj):
if isinstance(obj, ast.Module):
return evaluate(obj.body[0])
elif isinstance(obj, ast.Expr):
return evaluate(obj.value)
elif isinstance(obj, ast.Dict):
return {key.s: parse(value) for key, value in zip(obj.keys, obj.values)}
elif isinstance(obj, ast.List):
return [parse(element) for element in obj.elts]
elif isinstance(obj, ast.Str):
return obj.s
elif isinstance(obj, ast.Attribute):
return evaluate(obj.value) + "." + obj.attr
elif isinstance(obj, ast.Name):
return obj.id
elif isinstance(obj, ast.Num):
return obj.n
else:
print("I apparently forgot", type(obj))
x = evaluate(ast.parse(s))
print(x)
这会将字符串解析为抽象语法树,然后递归地从中构建一个 Python 对象,将属性转换为字符串。
相关文章:
- AngularJS-在JSON选择器中使用变量名
- 将Json作为变量加载到jsTree中
- 使用JSON文件中的变量(字符串)填充文本区域
- js-获取带有变量的json
- 如何在AngularJS-ng重复循环中将长JSON路径缩短为变量
- 如何将JSON数据转换为变量,解析并输出为HTML
- 当JSON数据=变量时,需要执行循环
- 我想将查询字符串变量添加到JSON名称/值对中
- 获取多维JSON变量的行数
- 如何通过解析JSON文件来分配JavaScript变量
- 如何将HTML表单(JSON格式)中的数据分配给变量
- AJAX将JSON数组保存到多个JS变量中
- 格式化AJax调用返回的Json,并将其分配给javascript变量
- 通过组合变量在解析JSON时访问随机对象
- 想要将 JSON 字符串传递给 javascript 变量 [ JSON.parse(),eval()] 对我不起作用,
- 如何将字符串添加到变量json字符串中,以便在highstock图表中添加标志
- 在变量(json data)内循环
- 如何在一个变量Json href属性中插入值
- 高图表:解析多变量 JSON 数据
- 如何识别变量JSON.stringify