Это должно быть так просто, но я просто не могу найти его после попытки в течение часа # смущать.
Мне нужно получить строку JSON, например {"k1":v1,"k2":v2}
, проанализирован как JsonNode
.
JsonFactory factory = new JsonFactory();
JsonParser jp = factory.createJsonParser("{\"k1\":\"v1\"}");
JsonNode actualObj = jp.readValueAsTree();
дает
java.lang.IllegalStateException: No ObjectCodec defined for the parser, can not deserialize JSON into JsonNode tree
#embarrasing
-- Нет. Если простые вещи не так просты, значит, разработчик API потерпел неудачу, а не вы.Ответы:
Небольшое отклонение от ответа Ричардса, но
readTree
может взять строку, чтобы вы могли упростить ее до:источник
ObjectNode
а неJsonNode
использоватьmapper.valueToTree("{\"k1\":\"v1\"}")
Вам нужно использовать
ObjectMapper
:Дополнительную документацию по созданию парсеров можно найти здесь .
источник
mapper.treeToValue()
. НоreadValue()
тоже работает.Третий вариант:
источник
JsonNode
. Тем не менее, вы обычно не хотитеJsonNode
, поэтому я хотел показать, как сказать Джексону, какую ценность вы хотите.JsonNode
очевидно, было необходимо, чтобы помешать Джексону десериализовать его как что-то еще, что не состоялось бы.Ответ Ричарда правильный. В качестве альтернативы вы также можете создать
MappingJsonFactory
(вorg.codehaus.jackson.map
), который знает, где найтиObjectMapper
. Вы получили ошибку, потому что обычныйJsonFactory
(изcore
пакета) не имеет зависимостиObjectMapper
(который находится вmapper
пакете).Но обычно вы просто используете
ObjectMapper
и не беспокоитесь оJsonParser
других низкоуровневых компонентах - они просто необходимы, если вы хотите привязать данные к части потока или выполнить низкоуровневую обработку.источник
источник
Новый подход к старому вопросу. Решение, которое работает с Java 9+
является более читабельным и обслуживаемым для сложных объектов. Ej
источник