Python中是否有解析此类序列化对象的库?

Is there a library for parsing such serialized objects in Python?

对于我的 python 程序,我有一个表示序列化对象的输入,它可以包含原始类型、数组和结构。

示例输入可能如下所示:

Struct(1.5, false, Struct2(“text”), [1, 2, 3])

示例输出为:

{
    type: "Struct",
    args: [
        1.5,
        False,
        {
            type: "Struct2",
            args: [ "text" ]
        },
        [ 1, 2, 3 ]
    ]
}

所以,输入字符串可以有:

输入格式非常合乎逻辑,但我找不到任何现成的 libraries/code 片段来解析这种格式。

这不是一个非常干净的实现,我不能 100% 确定它是否完全符合您的要求,但我建议使用 Lark 库来执行此操作。

与其使用现成的解析器来完成这项工作,不如自己做一个小的,为了节省时间,Lark 有“保存”和“加载”的功能,所以你可以保存一个序列化版本的解析器并每次加载它,而不是每次运行时都重新创建整个解析器。希望这有帮助:)

from lark import Lark, Transformer

grammar = """
%import common.WS
%import common.ESCAPED_STRING
%import common.SIGNED_NUMBER

%ignore WS

start : struct

struct  : NAME "(" [element ("," element)*] ")"
element : struct | array | primitive

array : "[" [element ("," element)*] "]"
primitive : number
          | string
          | boolean

string : ESCAPED_STRING
number : SIGNED_NUMBER

boolean : TRUE | FALSE

NAME : /[a-zA-Z][a-zA-Z0-9]*/

TRUE : "true"
FALSE : "false"
"""

class T(Transformer):
    def start(self, s):
        return s[0]

    def string(self, s):
        return s[0][1:-1].replace('\"', '"')

    def primitive(self, s):
        return s[0]

    def struct(self, s):
        return { "type": s[0].value, "args": s[1:] }

    def boolean(self, s):
        return s[0].value == "true"

    def element(self, s):
        return s[0]
    
    array = list

    def number(self, s):
        try:
            return int(s[0].value)
        except:
            return float(s[0].value)

parser = Lark(grammar, parser = "lalr", transformer = T())

test = """
Struct(1.5, false, Struct2("text"), [1, 2, 3])
"""

print(parser.parse(test))