Есть ли у меня способ сделать Джексона менее требовательным к входному JSON. Например, JSONObject предоставляет следующие разрешения:
Конструкторы более снисходительны к текстам, которые они принимают:
- Дополнительная (запятая) может стоять непосредственно перед закрывающей скобкой.
- Строки могут заключаться в кавычки с '(одинарная кавычка ).
- Строки вообще не нужно заключать в кавычки, если они не начинаются с кавычки или одинарной кавычки, и если они не содержат начальных или конечных пробелов, и если они не содержат ни одного из этих символов: {} знак равно # и если они не похожи на числа, и если они не являются зарезервированными словами true, false или null. *
- За ключами может следовать = или =>, а также:.
- За значениями могут следовать по ; (точка с запятой), а также через (запятая).
- Числа могут иметь префикс 0x- (шестнадцатеричный).
Самым интересным для меня является 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)