Jak przetworzyć łańcuch JSON do jsonnode w Jacksonie?

To powinno być takie proste, ale po prostu nie mogę go znaleźć po tym, jak próbuję przez godzinę # wstyd.

Muszę uzyskać łańcuch JSON, na przykład {"k1":v1,"k2":v2}, parsowany 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

Author: Peter Mortensen, 2010-09-06

5 answers

Lekka odmiana odpowiedzi Richardsa, ale readTree może przyjmować ciąg znaków, więc można go uprościć do:

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree("{\"k1\":\"v1\"}");
 326
Author: slashnick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-03 20:37:03

Musisz użyć ObjectMapper:

ObjectMapper mapper = new ObjectMapper();
JsonFactory factory = mapper.getJsonFactory(); // since 2.1 use mapper.getFactory() instead
JsonParser jp = factory.createJsonParser("{\"k1\":\"v1\"}");
JsonNode actualObj = mapper.readTree(jp);

Dalszą dokumentację dotyczącą tworzenia parserów można znaleźć tutaj .

 64
Author: Richard Fearn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-28 15:39:32

Trzeci wariant:

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readValue("{\"k1\":\"v1\"}", JsonNode.class);
 27
Author: qerub,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-20 14:50:13

Odpowiedź Richarda jest prawidłowa. Alternatywnie możesz również utworzyć MappingJsonFactory (w org.codehaus.jackson.map), który wie, gdzie znaleźć ObjectMapper. Błąd, który otrzymałeś, był spowodowany tym, że zwykły JsonFactory (z core pakietu) nie ma zależności od ObjectMapper (który znajduje się w mapper pakietu).

Ale zwykle po prostu używasz ObjectMapper i nie martw się o JsonParser lub inne komponenty niskiego poziomu-będą one po prostu potrzebne, jeśli chcesz powiązać dane z częściami strumienia lub obsługiwać niskopoziomowe.

 5
Author: StaxMan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-08 10:27:18
import com.github.fge.jackson.JsonLoader;
JsonLoader.fromString("{\"k1\":\"v1\"}")
== JsonNode = {"k1":"v1"}
 3
Author: pdxleif,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-01 23:01:22