使用Groovy LAX解析器解析JSON会给出错误的密钥

时间:2018-11-21 22:13:00

标签: json parsing groovy

我有一些JSON格式的配置文件,我需要用groovy编写的程序来解析它们。由于文件应该是人类可读的,因此我想使用LAX语法(和解析器),这样我就不需要将每个键和值都用引号引起来,也可以使用注释。

但是以某种方式,当我解析JSON文件时,在生成的映射中得到错误的键。

这里是一个例子。

JSON文件(我将其保存为a.json)是

{
    key1: aaa,
    key2: bbb
}

解析它的程序是

package test.json;

import groovy.json.JsonParserType;
import groovy.json.JsonSlurper;

public class JsonParser {

    static void main(String[] args) {
        JsonSlurper slurper = new JsonSlurper().setType(JsonParserType.LAX)
        def config = slurper.parse(new File('a.json'))
        println "key1: ${config.key1}"
        println "key2: ${config.key2}"
        for (e in config) {
            println "*** '${e.key}' (${e.key.class}) = '${e.value}' (${e.value.class})"
        }
    }

}

执行程序时,得到以下输出:

key1: aaa
key2: null
*** 'key1' (class java.lang.String) = 'aaa' (class java.lang.String)
*** '
    key2' (class java.lang.String) = 'bbb
' (class java.lang.String)

您看到第二个键未解析为“ key2”,但包含空格和换行符。

如何使解析器从键和值中删除空格,以便获得'key2'='bbb'(正如我对上述文件的期望)?

如果我将每个键和值都用双引号引起来,则所有内容都会按预期进行解析,即得到'key2'='bbb'。但是我认为使用LAX解析器不需要它们。

1 个答案:

答案 0 :(得分:0)

这现在对我有用,线索是使用normalize()方法:

def json = new File('a.json').text.normalize()
def config = slurper.parseText(json)