синтаксический анализ нестрогого json, в котором ключи не заключены в кавычки, с Java - PullRequest
3 голосов
/ 08 июня 2010

Я пытаюсь разобрать строку, которая в формате JSON только в том, что ключи не заключены в кавычки. Я могу очень хорошо разобрать эту строку в Javascript, но не могу найти Java API, который поможет мне разобрать это. Все API, которые я пробовал, предполагают строгий формат JSON.

Может кто-нибудь предложить библиотеку, которая имеет возможность разбирать это, или совершенно новый подход к проблеме (скажем, использовать вместо этого regex)?

Ответы [ 4 ]

1 голос
/ 19 апреля 2014

Вот решение в coffeescript, использующее библиотеку подчеркивания. Если вы не используете это, вы можете заменить _.foldl на цикл for.

 parseNonStrictJson = (value) ->
        inQuote = false
        correctQuotes = (memo, nextChar) ->
            insertQuote =
                (inQuote and not /[a-z0-9_"]/.test nextChar) or
                (!inQuote and /[a-z_]/.test nextChar)
            inQuote = (inQuote != (insertQuote or nextChar == '"') )
            memo + (if insertQuote then '"' else '') + nextChar
        valueWithQuotes = _.foldl(value + '\n', correctQuotes, "")
        JSON.parse(valueWithQuotes)

И то же самое в javascript:

function parseNonStrictJson(value) {
  var correctQuotes, inQuote, valueWithQuotes;
  inQuote = false;
  correctQuotes = function(memo, nextChar) {
    var insertQuote;
    insertQuote = (inQuote && !/[a-z0-9_"]/.test(nextChar)) || (!inQuote && /[a-z_]/.test(nextChar));
    inQuote = inQuote !== (insertQuote || nextChar === '"');
    return memo + (insertQuote ? '"' : '') + nextChar;
  };
  valueWithQuotes = _.foldl(value + '\n', correctQuotes, "");
  return JSON.parse(valueWithQuotes);
};
0 голосов
/ 09 июня 2017

Вы можете использовать eval:

var parsed = eval(json)

Будьте осторожны, поскольку eval также может запускать код, поэтому вы должны быть уверены, что знаете, что вы анализируете.Существует также модуль узла с именем jsonic , который анализирует JSON без перемешивания.

0 голосов
/ 08 июня 2010

Лично вы можете использовать шаблон состояния и добавить свои кавычки. Если я не ошибаюсь, шаблон состояния будет читать символ за символом и устанавливать флаги, чтобы указать, находимся ли мы в условии двойных кавычек и "двойные ли кавычки" в наших двойных кавычках. Используя это, и имена переменных не начинаются с цифры, вы можете добавить кавычки во время потоковой передачи, а затем отправить их в путь.

0 голосов
/ 08 июня 2010

Если ключи не заключены в кавычки, то это не JSON.

Вы должны либо взломать это самостоятельно, либо найти кого-то, кто уже это сделал.

Также нет такой вещи как нестрогий json . Существует только 1 версия JSON, и она строгая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...