如何使用 Lark 解析无效的 JSON?

让我们从考虑使用 lark 的简单 json 解析器开始:


import sys


from lark import Lark, Transformer, v_args


json_grammar = r"""

    ?start: value


    ?value: object

          | array

          | string

          | SIGNED_NUMBER      -> number

          | "true"             -> true

          | "false"            -> false

          | "null"             -> null


    array  : "[" [value ("," value)*] "]"

    object : "{" [pair ("," pair)*] "}"

    pair   : string ":" value


    string : ESCAPED_STRING


    %import common.ESCAPED_STRING

    %import common.SIGNED_NUMBER

    %import common.WS


    %ignore WS

"""



class TreeToJson(Transformer):

    @v_args(inline=True)

    def string(self, s):

        return s[1:-1].replace('\\"', '"')


    array = list

    pair = tuple

    object = dict

    number = v_args(inline=True)(float)


    def null(self, _): return None


    def true(self, _): return True


    def false(self, _): return False



if __name__ == '__main__':

    json_parser = Lark(json_grammar, parser='lalr', lexer='standard', transformer=TreeToJson())

    parse = json_parser.parse


    dct = parse('''

        {

            "empty_object" : {},

            "empty_array"  : [],

            "booleans"     : { "YES" : true, "NO" : false },

            "numbers"      : [ 0, 1, -2, 3.3, 4.4e5, 6.6e-7 ],

            "strings"      : [ "This", [ "And" , "That", "And a \\"b" ] ],

            "nothing"      : null

        }

    ''')

    print(dct)

上面的例子来自官方示例网站,它能够解析有效的json。


到目前为止一切顺利,但我的问题是如何扩展此语法和转换器,以便它还能够解析无效的 json 字符串,例如以下字符串:


dct = parse('''

    [

        // Item1

        { "key1": "value1" },

        // Item2

        { "key2": "value2", "key3": ["a","b",] },

        // Item3

        { "key4": [{"key5":"value5"},] },

    ]

''')

我的主要目标是能够解析 SublimeText 资产(它是 json 的超集),STsublime_api.decode_value在幕后使用……但是这个函数是闭源的,所以我不能使用它。此外,我没有找到任何开箱即用的 pypi 库来处理这种类型的数据,所以我决定最好的机会是尝试编写我自己的自定义“无效 json”解析器。


慕工程0101907
浏览 263回答 2
2回答

猛跑小猪

该demjson库非常擅长解析有问题的 json:import demjsonstr = '''    [        // Item1        { "key1": "value1" },        // Item2        { "key2": "value2", "key3": ["a","b",] },        // Item3        { "key4": [{"key5":"value5"},] },    ]'''print(demjson.decode(str))结果:[{'key1': 'value1'}, {'key2': 'value2', 'key3': ['a', 'b']}, {'key4': [{'key5': 'value5'}]}]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python