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
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\"}");
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 .
Une troisième variante:
ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readValue("{\"k1\":\"v1\"}", JsonNode.class);
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.
import com.github.fge.jackson.JsonLoader;
JsonLoader.fromString("{\"k1\":\"v1\"}")
== JsonNode = {"k1":"v1"}