Разбор JSON с отличным парсером LAX дает неправильные ключи - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть некоторые файлы конфигурации в формате 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 голосов
/ 22 ноября 2018

Это работает для меня сейчас, ключ к использованию метода normalize():

def json = new File('a.json').text.normalize()
def config = slurper.parseText(json)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...