[java] Jackson에서 JSON 문자열을 JsonNode로 구문 분석하는 방법은 무엇입니까?

너무 간단해야하지만 #embarrasing 한 시간 동안 시도한 후에는 찾을 수 없습니다.

예를 들어 {"k1":v1,"k2":v2}로 구문 분석 된 JSON 문자열을 가져와야합니다 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



답변

Richards가 약간 변형했지만 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);


답변

Richard의 대답은 맞습니다. 또는 찾을 위치를 아는 MappingJsonFactory(in org.codehaus.jackson.map)을 만들 수도 있습니다 ObjectMapper. 일반 때문에 당신이있어 오류는 JsonFactory(에서 core패키지)에 대한 종속성이 없습니다 ObjectMapper합니다 (인 mapper패키지).

그러나 일반적으로 사용 하거나 ObjectMapper걱정하지 JsonParser않거나 다른 하위 수준 구성 요소는 걱정하지 않아도 됩니다. 스트림의 일부를 데이터 바인딩하거나 하위 수준 처리를 수행하려는 경우에만 필요합니다.


답변

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


답변

오래된 질문에 대한 새로운 접근. Java 9 이상에서 작동하는 솔루션

ObjectNode agencyNode = new ObjectMapper().valueToTree(Map.of("key", "value"));

복잡한 객체에 대해 더 읽기 쉽고 유지 관리가 쉽습니다. j

Map<String, Object> agencyMap = Map.of(
        "name", "Agencia Prueba",
        "phone1", "1198788373",
        "address", "Larrea 45 e/ calligaris y paris",
        "number", 267,
        "enable", true,
        "location", Map.of("id", 54),
        "responsible", Set.of(Map.of("id", 405)),
        "sellers", List.of(Map.of("id", 605))
);
ObjectNode agencyNode = new ObjectMapper().valueToTree(agencyMap);


답변