programing

JsonNode를 POJO로 변환

projobs 2022. 8. 27. 22:59
반응형

JsonNode를 POJO로 변환

이것은 조금 특이하게 보일 수 있지만, 저는 효율적인 변환/매핑 방법을 찾고 있습니다.JsonNodePOJO.

모델 정보 중 일부를 json 파일에 저장하기 때문에 몇 가지 버전의 모델을 지원해야 합니다.

Json Node의 메모리에 json 파일을 로드하고 최신 버전의 모델과 일치하도록 몇 가지 버전 전략을 적용합니다.

    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마이모델로

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

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

어디에jsonObjectMapperJackson이다.ObjectMapper.


잭슨의 이전 버전에서는

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문자열, java.lang.클래스)

커스텀 디시리얼라이저를 정의할 수도 있습니다.ObjectMapper: http://wiki.fasterxml.com/JacksonHowToCustomDeserializers

편집: 방금 다른 것이 생각났습니다.착신하는 객체의 속성이 다음 값보다 클 경우POJO설정하려는 추가 정보는 무시해야 합니다.

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

그렇지 않으면 설정할 속성을 찾을 수 없다는 오류가 표시됩니다.

org.codehouse.jackson을 사용하는 경우 1.6부터 가능합니다.JsonNode를 POJO로 변환할 수 있습니다.ObjectMapper#readValue: http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(org.codehaus.jackson.JsonNode, java.lang.클래스)


    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의 추가 속성을 무시하고 싶다면 다음과 같이 Object Mapper를 설정할 수 있습니다.이 구문은 이전 Jackson 버전과는 다릅니다.(잘못된 구문을 사용하면 아무 작업도 하지 않습니다.)

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

이 방법은 다른 방법으로 객체 배열에 사용할 수 있습니다.

ObjectReader reader = mapper.readerFor(new TypeReference<List<SomeClass>>() {
});
assert someJsonNode.isArray()
List<SomeClass> list = reader.readValue(someJsonNode);

언급URL : https://stackoverflow.com/questions/19711695/convert-jsonnode-into-pojo

반응형