web-dev-qa-db-fra.com

Comment analyser une chaîne JSON dans JsonNode sous Jackson?

Cela devrait être si simple, mais je ne peux pas le trouver après avoir essayé pendant une heure embarrassante.

Je dois obtenir une chaîne JSON, par exemple, {"k1":v1,"k2":v2}, analysé comme un JsonNode.

JsonFactory factory = new JsonFactory();
JsonParser jp = factory.createJsonParser("{\"k1\":\"v1\"}");
JsonNode actualObj = jp.readValueAsTree();

donne

Java.lang.IllegalStateException: No ObjectCodec defined for the parser, can not deserialize JSON into JsonNode tree

218
fadmaa

Une légère variation de la réponse de Richards mais readTree peut prendre une chaîne pour que vous puissiez la simplifier:

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree("{\"k1\":\"v1\"}");
352
slashnick

Vous devez utiliser un 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);

Une documentation supplémentaire sur la création d'analyseurs peut être trouvée ici .

69
Richard Fearn

Une troisième variante:

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readValue("{\"k1\":\"v1\"}", JsonNode.class);
27
qerub

La réponse de Richard est correcte. Vous pouvez également créer un MappingJsonFactory (dans org.codehaus.jackson.map) qui sait où trouver ObjectMapper. L'erreur que vous avez provoquée est due au fait que le JsonFactory (du package core) normal n'a pas de dépendance en ObjectMapper (qui se trouve dans le package mapper).

Mais en général, vous utilisez simplement ObjectMapper sans vous soucier de JsonParser ou d'autres composants de bas niveau. Ils vous seront utiles si vous souhaitez lier des parties de flux de données ou effectuer une manipulation de bas niveau.

5
StaxMan
import com.github.fge.jackson.JsonLoader;
JsonLoader.fromString("{\"k1\":\"v1\"}")
== JsonNode = {"k1":"v1"}
3
pdxleif