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

Était-ce utile?

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);

Autres documents sur la création parseurs se trouve .

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"}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top