我有一个格式错误的JSON字符串需要解析。 JSON字符串的键不包含在双引号中,字符串值用单引号括起来而不是双引号。
示例:
{ items: [
{ id: 1, name: 'test1' },
{ id: 2, name: 'test2' }
] }
解析这个JSON字符串的更好方法是什么?
1)编写自定义解析器(如何?)
2)尝试通过执行一些string_replace
来修复JSON字符串有一点需要注意,JSON字符串非常长(大约50kb)并且包含很多条目。
答案 0 :(得分:6)
Yaml是一个超级(几乎)的JSon并且更加宽容。它更接近你默认拥有的东西。
String s = "{ items: [\n" +
" { id: 1, name: 'test1' }, \n" +
" { id: 2, name: 'test2' }\n" +
"] }";
Map map = (Map) new Yaml().load(s);
System.out.println(map);
打印
{items=[{id=1, name=test1}, {id=2, name=test2}]}
BTW这是默认情况下转储到Yaml的方式。
System.out.println(new Yaml().dump(map));
打印
items:
- {id: 1, name: test1}
- {id: 2, name: test2}
我使用了snakeyaml。您还可以将数据绑定到类(es)
答案 1 :(得分:1)
我认为Antlr4是这项工作的最佳工具。
您可以在这里找到example of a JSON grammar,您可以根据自己的需要轻松修改,例如,STRING
词汇可以修改:
STRING : '"' (ESC | ~["\\])* '"' ;
为:
STRING : '\'' (ESC | ~["\\])* '\'' ;
您可以将pair
规则修改为:
UNQUOTEDSTRING : (ESC | ~["\\])* ;
pair: UNQUOTEDSTRING ':' value ;
然后使用侦听器或访问者,您可以将修改后的JSON转换为正确的版本,或直接将其解析为对象。