慕工程0101907
2021-10-12 17:23:22
讓我們從考慮使用 lark 的簡(jiǎn)單 json 解析器開始:import sysfrom lark import Lark, Transformer, v_argsjson_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 Falseif __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)上面的例子來(lái)自官方示例網(wǎng)站,它能夠解析有效的json。到目前為止一切順利,但我的問(wèn)題是如何擴(kuò)展此語(yǔ)法和轉(zhuǎn)換器,以便它還能夠解析無(wú)效的 json 字符串,例如以下字符串:dct = parse(''' [ // Item1 { "key1": "value1" }, // Item2 { "key2": "value2", "key3": ["a","b",] }, // Item3 { "key4": [{"key5":"value5"},] }, ]''')我的主要目標(biāo)是能夠解析 SublimeText 資產(chǎn)(它是 json 的超集),STsublime_api.decode_value在幕后使用……但是這個(gè)函數(shù)是閉源的,所以我不能使用它。此外,我沒(méi)有找到任何開箱即用的 pypi 庫(kù)來(lái)處理這種類型的數(shù)據(jù),所以我決定最好的機(jī)會(huì)是嘗試編寫我自己的自定義“無(wú)效 json”解析器。
2 回答

猛跑小豬
TA貢獻(xiàn)1858條經(jīng)驗(yàn) 獲得超8個(gè)贊
該demjson庫(kù)非常擅長(zhǎng)解析有問(wèn)題的 json:
import demjson
str = '''
[
// Item1
{ "key1": "value1" },
// Item2
{ "key2": "value2", "key3": ["a","b",] },
// Item3
{ "key4": [{"key5":"value5"},] },
]
'''
print(demjson.decode(str))
結(jié)果:
[{'key1': 'value1'}, {'key2': 'value2', 'key3': ['a', 'b']}, {'key4': [{'key5': 'value5'}]}]
添加回答
舉報(bào)
0/150
提交
取消