Сделайте Джексона более дружелюбным для ввода JSON - PullRequest
14 голосов
/ 12 апреля 2011

У меня есть способ сделать Джексона менее требовательным к входному JSON.Например, JSONObject предоставляет следующие допуски:

Конструкторы более просты в текстах, которые они примут:

  1. Дополнительная (запятая) может появиться непосредственно перед закрывающей скобкой.
  2. Строки могут быть заключены в кавычки '(одинарные кавычки).
  3. Строки вообще не должны заключаться в кавычки, если они не начинаются с кавычек или одинарных кавычек, и если они не содержатначальные или конечные пробелы, и если они не содержат ни одного из этих символов: {} [] / \:, =;# и если они не похожи на числа и если они не являются зарезервированными словами true, false или null. *
  4. За ключами может следовать знак = или =>, а также:.
  5. Значения могут сопровождаться;(точка с запятой), а также, (запятая).
  6. Числа могут иметь префикс 0x- (hex).

Самое интересное для меня - это 3-я точка.Это позволяет следующее преобразование:

new JSONObject("{A : 1}");

... но для Джексона я получу ошибку с тем же входом json:

new ObjectMapper().readTree("{ A : 1}"); // throws an exception

Исключение:

org.codehaus.jackson.JsonParseException: Unexpected character ('A' (code 65)): was expecting double-quote to start field name
   at [Source: java.io.StringReader@26d4f1; line: 1, column: 4]
at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:943)
at org.codehaus.jackson.impl.JsonParserBase._reportError(JsonParserBase.java:636)
at org.codehaus.jackson.impl.JsonParserBase._reportUnexpectedChar(JsonParserBase.java:569)
at org.codehaus.jackson.impl.ReaderBasedParser._handleUnusualFieldName(ReaderBasedParser.java:342)
at org.codehaus.jackson.impl.ReaderBasedParser._parseFieldName(ReaderBasedParser.java:235)
at org.codehaus.jackson.impl.ReaderBasedParser.nextToken(ReaderBasedParser.java:125)
at org.codehaus.jackson.map.deser.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:180)
at org.codehaus.jackson.map.deser.BaseNodeDeserializer.deserializeAny(JsonNodeDeserializer.java:210)
at org.codehaus.jackson.map.deser.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:52)
at org.codehaus.jackson.map.deser.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:13)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:1588)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1130)

Ответы [ 2 ]

12 голосов
/ 12 апреля 2011

Список расширений для нестандартного JSON (т. Е. Материал, который НЕ является JSON, но достаточно близок, чтобы его можно было поддерживать) можно найти по адресу: http://wiki.fasterxml.com/JacksonFeaturesNonStandard

Из вашего списка, (2)и (3) может быть сделано (плюс несколько других вещей, не перечисленных, например, комнет).Другие не поддерживаются;и хотя проект добавил поддержку некоторых распространенных расширений, существуют ограничения на то, что будет рассматриваться.Конечно, всегда можно попросить новые функции;функции добавляются на основе запроса, вариантов использования.

По моему личному мнению, следует либо следовать стандарту, либо определять новые форматы - HTML является хорошим примером дыр в крысах, которые можно получить, пытаясь поддерживать вещи, которые «почти, но не совсем» действительны.Нет никаких ограничений для настройки и страдает функциональная совместимость: поскольку стандарта нет, все реализации поддерживают некоторые несовместимые подмножества функций и конструкций.

4 голосов
/ 12 апреля 2011

Проверьте этот связанный вопрос.Он показывает, как настроить ObjectMapper, чтобы делать то, что вы хотите, и также есть хорошее обсуждение того, почему вы не можете этого делать:)

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