在Java中解析格式错误的json

时间:2014-05-07 14:42:48

标签: java json parsing

我有一个格式错误的JSON字符串需要解析。 JSON字符串的键不包含在双引号中,字符串值用单引号括起来而不是双引号。

示例:

{ items: [
    { id: 1, name: 'test1' }, 
    { id: 2, name: 'test2' }
] }

解析这个JSON字符串的更好方法是什么?

1)编写自定义解析器(如何?)

2)尝试通过执行一些string_replace

来修复JSON字符串

有一点需要注意,JSON字符串非常长(大约50kb)并且包含很多条目。

2 个答案:

答案 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转换为正确的版本,或直接将其解析为对象。