Подтвердить что ты не робот

Сделайте Jackson более дружественным для ввода JSON

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

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

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

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

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

... но для jackson я получу ошибку с тем же входом 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: [email protected]; 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)
4b9b3361

Ответ 1

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

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

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

Ответ 2

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