gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:17:09 28 4
gpt4 key购买 nike

让我们首先考虑使用 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)

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

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

dct = parse('''
[
// Item1
{ "key1": "value1" },
// Item2
{ "key2": "value2", "key3": ["a","b",] },
// Item3
{ "key4": [{"key5":"value5"},] },
]
''')

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

最佳答案

demjson库非常擅长解析有问题的 json:

import demjson

str = '''
[
// 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'}]}]

关于python - 如何使用 Lark 解析无效的 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54223662/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com