如何用未知函数的json加载将字符串反序列化为dict?

ppcbkaq5  于 2023-03-04  发布在  其他
关注(0)|答案(1)|浏览(98)

当我有这样一根弦

test = '{"key1":"value1", "key2": UnknownFunction("value2")}'

我无法使用json.loads反序列化其内容,因为序列化的数据对象包含未知函数。是否有简单的方法将这样的函数(或任何未知函数)Map到str,以便我可以反序列化数据对象以获得如下的dict

{"key1":"value1", "key2": "value2"}


下面的代码是工作,但也许有一些更好的方法?

for removable in ["UnknownFunction"]:
    test= test.replace(removable + "(", "")
test = test.replace(")", "")
data = json.loads(test)
g6ll5ycj

g6ll5ycj1#

您可以使用自己的NodeTransformer来处理函数调用:

import ast

class Transformer(ast.NodeTransformer):

    def generic_visit(self, node):
        super().generic_visit(node)
        if isinstance(node, ast.Call):
            _args = node.args
            return _args if len(_args) > 0 else ast.Constant(value='null')
        return node

def transform_eval(py_str):
    return ast.literal_eval(Transformer().visit(ast.parse(py_str,
                                                          mode='eval')).body)

testStr = """        {
        "key1": "value1", 
        "key2": UnknownFunction("value1"),
        "key3": foo(),
        }"""

print(transform_eval(testStr.strip()))

输出:

{'key1': 'value1', 'key2': 'value1', 'key3': 'null'}
    • 注**:

我还没有检查是否所有可能的函数参数组合都有效:UnknownFunction("value1", foo="bar")UnknownFunction(*args, foo="bar")

相关问题