Deve ser tão simples, mas não consigo encontrá-lo depois de tentar por uma hora #embarrasing.
Eu preciso obter uma string JSON, por exemplo {"k1":v1,"k2":v2}
, analisada como a JsonNode
.
JsonFactory factory = new JsonFactory();
JsonParser jp = factory.createJsonParser("{\"k1\":\"v1\"}");
JsonNode actualObj = jp.readValueAsTree();
dá
java.lang.IllegalStateException: No ObjectCodec defined for the parser, can not deserialize JSON into JsonNode tree
#embarrasing
-- Não. Se coisas simples não são simples, o designer da API falhou, não você.Respostas:
Uma leve variação na resposta de Richards, mas
readTree
pode levar uma string, para que você possa simplificá-la para:fonte
ObjectNode
em vez de umJsonNode
usomapper.valueToTree("{\"k1\":\"v1\"}")
Você precisa usar um
ObjectMapper
:Mais documentação sobre a criação de analisadores pode ser encontrada aqui .
fonte
mapper.treeToValue()
. MasreadValue()
também funciona.Uma terceira variante:
fonte
JsonNode
. No entanto, você geralmente não quer umJsonNode
, então eu queria mostrar como dizer a Jackson que tipo de valor você deseja.JsonNode
era aparentemente necessária para impedir que Jackson a desserializasse como outra coisa - o que teria falhado.A resposta de Richard está correta. Como alternativa, você também pode criar um
MappingJsonFactory
(inorg.codehaus.jackson.map
) que sabe onde encontrarObjectMapper
. O erro que você recebeu foi porque o regularJsonFactory
(docore
pacote) não tem dependência deObjectMapper
(que está nomapper
pacote).Mas geralmente você apenas usa
ObjectMapper
e não se preocupaJsonParser
ou com outros componentes de baixo nível - eles serão necessários apenas se você desejar vincular partes do fluxo ou fazer manuseio de baixo nível.fonte
fonte
Nova abordagem para a pergunta antiga. Uma solução que funciona a partir do java 9+
é mais legível e fácil de manter para objetos complexos. Ej
fonte