ALLOW_UNQUOTED_FIELD_NAMES в библиотеке JSON Джексона - PullRequest
15 голосов
/ 27 января 2011

Я использую библиотеку Джексона для сериализации / десериализации в / из JSON. Мне нужно, чтобы этот JSON имел наименьший возможный размер, поэтому я включил функцию ALLOW_UNQUOTED_FIELD_NAMES, чтобы исключить все кавычки. Я знаю, что удаление кавычек не является стандартным json, но сделать json small - сложное требование проекта. Сгенерированный json работает, но когда я пытаюсь прочитать значение json, я получаю исключение:

org.codehaus.jackson.JsonParseException: Неожиданный символ («9» (код 57)): ожидал любое действительное имя символ (для имени без кавычек) или двойная кавычка (для цитирования) для начала имя поля в [Источник: java.io.StringReader@1347d75; строка 1, колонка: 3]

Когда я читаю этот json, возникает исключение выше:

{90110a2e-febd-470f-afa4-cf7e890d31b9:0,eec652ad-a4d9-4eb1-8d24-7c1a0c29449f:1}

Я прочитал так:

Map<String, Object> valuesMap = oM.readValue(json, new TypeReference<Map<String, Object>>() {});

и средство отображения объектов, которое я использую как для чтения, так и для записи значений:

private static final ObjectMapper om = new ObjectMapper();
static {
    om.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, false);
    om.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
    om.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, true);
    om.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    om.getSerializationConfig().setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
}

Я использую версию 1.6.3 Джексона как в проектах отправителя, так и в получателе. Необходимая версия для этой функции - 1.2+, поэтому я подумал, что, возможно, я не использовал эту версию, но мой приемник - приложение Spring, и я проверил, что библиотека, установленная в папке libs, - 1.6.3.

Что я могу делать не так? Возможно, эту функцию нельзя использовать с картами.

У меня есть еще один вопрос. Пока я просто отправляю карту, где ключом является просто значение uuid, а значением является число. Могу ли я иметь какие-либо проблемы, если я отправлю значение со специальными символами с включенной функцией ALLOW_UNQUOTED_FIELD_NAMES? Джексон сбежит от этих персонажей?

Спасибо.

Ответы [ 3 ]

6 голосов
/ 27 января 2011

Хорошо, я думаю, что ответ Pingw33n в значительной степени правильный.Итак: да, вы можете использовать эту функцию;но он довольно эвристический - поскольку не существует спецификации относительно того, как должны работать имена без кавычек (в конце концов, JSON допускает любые и все символы для имен!);или, что если использовать какой-либо механизм экранирования, кто-то догадывается, что следует написать или принять.

В данном конкретном случае это, вероятно, символ «-», вызывающий проблему.Это не является юридической частью имени Javascript, которое является приближением, которое использует Джексон.

Одним из возможных решений было бы то, что Джексон мог бы экранировать такие символы в именах свойств (я не помню, как это делается в настоящее время; еслилюбые имена символов указаны в кавычках).Если вы можете разобраться в простом тестовом примере, вы можете подать запрос на расширение Jira на Джексон Джира , чтобы добавить экранирование (и убедиться, что парсер может отменить обычную версию с обратной косой чертой).

5 голосов
/ 27 января 2011

Похоже, что Джексон с QUOTE_FIELD_NAMES в некоторых случаях выдает такой вывод, что не может считывать себя даже при включенном ALLOW_UNQUOTED_FIELD_NAMES.Вероятно, вам потребуется реализовать пользовательский JsonParser для нестандартного анализа ввода.

Проблема в том, что вы генерируете нестандартный JSON, и нет никаких гарантий, что клиент справится с этим должным образом.Однако, если вы не предоставляете его вне вашего приложения (приложений) и не заботитесь о размере, вы можете проанализировать / сгенерировать двоичный формат, такой как Smile Джексона.См. http://www.cowtowncoder.com/blog/archives/2010/09/entry_418.html (2,4).

2 голосов
/ 27 января 2011

Я считаю, что проблема связана с синтаксисом Javascript, а не с Джексоном и JSON.

В Javascript имя - это буква, за которой, возможно, следуют одна или несколько букв, цифр или подчеркивания, поэтому 90110a2e-febd-470f-afa4-cf7e890d31b9 не является допустимым именем Javascript.

Кавычки вокруг имени свойства являются необязательными, если имя будет допустимым именем JavaScript, а не зарезервированным словом. Таким образом, кавычки обязательны для имени, но не обязательны для имени.

Кстати, если вас так беспокоит размер JSON, почему бы вам не сжать его?

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