Ответ 1
Небольшое отклонение от ответа Ричардса, но readTree
может взять строку, чтобы упростить ее:
ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree("{\"k1\":\"v1\"}");
Это должно быть так просто, но я просто не могу найти его, пробовав чаС#embarrasing.
Мне нужно получить строку JSON, например, {"k1":v1,"k2":v2}
, проанализировано как JsonNode
.
JsonFactory factory = new JsonFactory();
JsonParser jp = factory.createJsonParser("{\"k1\":\"v1\"}");
JsonNode actualObj = jp.readValueAsTree();
дает
java.lang.IllegalStateException: No ObjectCodec defined for the parser, can not deserialize JSON into JsonNode tree
Небольшое отклонение от ответа Ричардса, но readTree
может взять строку, чтобы упростить ее:
ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree("{\"k1\":\"v1\"}");
Вам нужно использовать 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);
Третий вариант:
ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readValue("{\"k1\":\"v1\"}", JsonNode.class);
Ответ Ричард правильный. В качестве альтернативы вы также можете создать MappingJsonFactory
(в org.codehaus.jackson.map
), который знает, где найти ObjectMapper
. Вы получили ошибку, потому что обычный JsonFactory
(из пакета core
) не имеет отношения к ObjectMapper
(который находится в пакете mapper
).
Но обычно вы просто используете ObjectMapper
и не беспокоитесь о JsonParser
или других компонентах низкого уровня - они понадобятся только в том случае, если вы хотите привязать данные к потоку или выполнить обработку на низком уровне.
import com.github.fge.jackson.JsonLoader;
JsonLoader.fromString("{\"k1\":\"v1\"}")
== JsonNode = {"k1":"v1"}