Есть ли у меня способ сделать Джексона менее требовательным к вводу 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)