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


231

너무 간단해야하지만 #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


54
#embarrasing-아니 간단한 것이 간단하지 않으면 API 디자이너가 실패한 것입니다.
jameshfisher

코드에서 @StaxMan의 답변 : JsonFactory factory = new MappingJsonFactory ();
Juan Rojas

답변:


371

Richards가 약간 변형했지만 readTree문자열을 취할 수 있으므로 다음과 같이 단순화 할 수 있습니다.

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree("{\"k1\":\"v1\"}");

44
사용 이 ObjectNode아닌 누군가를 JsonNode위해mapper.valueToTree("{\"k1\":\"v1\"}")
Matthew Herbst

5
@MatthewHerbst 2.5.1에서는 "{\"k1 \ ": \"v1 \ "}"문자열을 JSON으로 구문 분석하지 않고 새 텍스트 노드를 만듭니다.
minexew

69

당신은 사용해야합니다 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);

파서 작성에 대한 추가 문서는 여기 에서 찾을 수 있습니다 .


JsonNode를 가져 와서 약간 수정 한 다음 mapper.readValue (node, class)를 호출 할 수 있습니까? 그리고 수업을 꺼내?
portforwardpodcast

1
예. 그것에 대한 별칭도 있습니다 mapper.treeToValue(). 그러나 readValue()작동합니다.
StaxMan

연결이 끊어진 것 같습니다
manuna

28

세 번째 변형 :

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readValue("{\"k1\":\"v1\"}", JsonNode.class);

JsonNode.class를 전달하면 실제로 무엇을 얻을 수 있습니까?
David

3
@David : 아무것도 아니므로 슬래시 닉의 변형은 분명히을 원한다면 더 좋습니다 JsonNode. 그러나 일반적으로을 원하지 JsonNode않기 때문에 Jackson에게 어떤 종류의 가치를 원하는지 알려주는 방법을 보여주고 싶었습니다.
qerub

나를 JsonNode위해 잭슨이 잭을 직렬화하지 못하도록 막는 것이 필요했습니다.
Cory Klein

5

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

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


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

0

오래된 질문에 대한 새로운 접근. 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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.