Comment analyser une chaîne JSON dans JsonNode à Jackson?
Question
Il devrait être si simple, mais je ne peux pas le trouver après avoir essayé pendant une heure #embarrasing.
Je dois obtenir une chaîne JSON, par exemple, {"k1":v1,"k2":v2}
, analysable comme 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
La solution
Une légère variation sur la réponse Richards mais readTree
peut prendre une chaîne de sorte que vous pouvez simplifier à:
ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree("{\"k1\":\"v1\"}");
Autres conseils
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 troisième variante:
ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readValue("{\"k1\":\"v1\"}", JsonNode.class);
La réponse de Richard est correcte. Sinon, vous pouvez également créer un MappingJsonFactory
(en org.codehaus.jackson.map
) qui sait où trouver ObjectMapper
. L'erreur que vous avez été parce que la JsonFactory
régulière (du paquet de core
) n'a pas de dépendance à ObjectMapper
(qui est dans le paquet mapper
).
Mais généralement, vous utilisez juste ObjectMapper
et ne vous inquiétez pas à propos de JsonParser
ou d'autres composants de bas niveau -. Ils seront simplement nécessaires si vous voulez données Saucisson parties du flux, ou faites la manipulation de bas niveau
import com.github.fge.jackson.JsonLoader;
JsonLoader.fromString("{\"k1\":\"v1\"}")
== JsonNode = {"k1":"v1"}