Powinno to być takie proste, ale po prostu nie mogę go znaleźć po godzinnej próbie # zawstydzenia.
Muszę na przykład pobrać ciąg JSON {"k1":v1,"k2":v2}
, przetworzony jako JsonNode
.
JsonFactory factory = new JsonFactory();
JsonParser jp = factory.createJsonParser("{\"k1\":\"v1\"}");
JsonNode actualObj = jp.readValueAsTree();
daje
java.lang.IllegalStateException: No ObjectCodec defined for the parser, can not deserialize JSON into JsonNode tree
#embarrasing
-- nie. Jeśli proste rzeczy nie są proste, to projektant API zawiódł, a nie ty.Odpowiedzi:
Niewielka odmiana odpowiedzi Richardsa, ale
readTree
można pobrać ciąg znaków, aby uprościć:źródło
ObjectNode
raczej niżJsonNode
użyciamapper.valueToTree("{\"k1\":\"v1\"}")
Musisz użyć
ObjectMapper
:Dalszą dokumentację dotyczącą tworzenia parserów można znaleźć tutaj .
źródło
mapper.treeToValue()
. AlereadValue()
też działa.Trzeci wariant:
źródło
JsonNode
. Jednak zazwyczaj nie chceszJsonNode
, więc chciałem pokazać, jak powiedzieć Jacksonowi, jakiej wartości chcesz.JsonNode
było najwyraźniej konieczne, aby powstrzymać Jacksona przed deserializacją tego jako czegoś innego - co by się nie udało.Odpowiedź Richarda jest poprawna. Alternatywnie możesz również utworzyć
MappingJsonFactory
(worg.codehaus.jackson.map
), który wie, gdzie znaleźćObjectMapper
. Wystąpił błąd, ponieważ zwykłyJsonFactory
(zcore
pakietu) nie jest zależny odObjectMapper
(który jest wmapper
pakiecie).Ale zwykle używasz
ObjectMapper
i nie martwisz się oJsonParser
inne komponenty niskiego poziomu - będą one potrzebne tylko wtedy, gdy chcesz powiązać dane części strumienia lub wykonywać operacje na niskim poziomie.źródło
źródło
Nowe podejście do starego pytania. Rozwiązanie, które działa z java 9+
jest bardziej czytelny i łatwy w utrzymaniu dla złożonych obiektów. Ej
źródło