[java] JsonNode를 POJO로 변환

이것은 조금 이상한 것처럼 보일 수 있습니다,하지만 난 / 변환을지도 할 수있는 효율적인 방법을 찾고 있어요 JsonNodePOJO.

내 모델 정보 중 일부를 json 파일에 저장하고 내 모델의 두 가지 버전을 지원해야합니다.

내가하는 일은 json 파일을 JsonNode의 메모리에로드하고 최신 버전의 모델과 일치하도록 몇 가지 버전 관리 전략을 적용하는 것입니다.

    ObjectMapper mapper = new ObjectMapper();
    BufferedReader fileReader = new BufferedReader(new FileReader(projPath));

    JsonNode rootNode = mapper.readTree(fileReader);

    //Upgrade our file in memory
    applyVersioningStrategy(rootNode);

    ProjectModel project = mapJsonNodeToProject(rootNode);

더 빠른 방법이 없다면, 아마도 JsonNodes내 모델에 수동으로 적용하는 것입니다.



답변

Jackson 2.4에서는 다음과 같이 변환 할 수 있습니다.

MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);

jsonObjectMapper잭슨은 어디에 있습니까 ObjectMapper?


이전 버전의 Jackson에서는

MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);


답변

트릭을 수행해야합니다.

mapper.readValue(fileReader, MyClass.class);

내가 가진 것을 사용하고 있기 때문에 내가해야 말을 String하는 안 BufferedReader하지만 작업 계속해야한다.

내 코드는 다음과 같습니다.

String inputString = // I grab my string here
MySessionClass sessionObject;
try {
    ObjectMapper objectMapper = new ObjectMapper();
    sessionObject = objectMapper.readValue(inputString, MySessionClass.class);

다음은 해당 호출에 대한 공식 문서입니다. http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(java.lang.String, java.lang.Class)

당신이 인스턴스를 할 때 당신은 또한 사용자 정의 디시리얼라이저를 정의 할 수 있습니다 ObjectMapper:
http://wiki.fasterxml.com/JacksonHowToCustomDeserializers

편집 : 방금 다른 것을 기억했습니다. 객체가 가지고있는 것보다 많은 속성을 POJO가지고 있고 여분의 것을 무시하고 싶다면 이것을 설정하고 싶을 것입니다 :

    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

또는 설정할 속성을 찾을 수 없다는 오류가 발생합니다.


답변

org.codehaus.jackson을 사용하는 경우 1.6 이후 가능합니다. 당신이 가진 POJO에 JsonNode을 변환 할 수 있습니다 ObjectMapper#readValue: http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(org.codehaus.jackson.JsonNode , 자바. lang.Class)


    ObjectMapper mapper = new ObjectMapper();
    JsonParser jsonParser = mapper.getJsonFactory().createJsonParser("{\"foo\":\"bar\"}");
    JsonNode tree = jsonParser.readValueAsTree();
    // Do stuff to the tree
    mapper.readValue(tree, Foo.class);


답변

String jsonInput = "{ \"hi\": \"Assume this is the JSON\"} ";
com.fasterxml.jackson.databind.ObjectMapper mapper =
    new com.fasterxml.jackson.databind.ObjectMapper();
MyClass myObject = objectMapper.readValue(jsonInput, MyClass.class);

JSON 입력의 POJO보다 많은 속성이 있고 Jackson 2.4의 추가 기능을 무시하려는 경우 다음과 같이 ObjectMapper를 구성 할 수 있습니다. 이 구문은 이전 Jackson 버전과 다릅니다. (잘못된 구문을 사용하면 아무 것도 자동으로 수행되지 않습니다.)

mapper.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNK‌​NOWN_PROPERTIES);


답변