[java] JSON이있는 Jackson : 인식 할 수없는 필드, 무시할 수없는 것으로 표시되지 않음

특정 JSON 문자열을 Java 객체로 변환해야합니다. JSON 처리에 Jackson을 사용하고 있습니다. 입력 JSON을 제어 할 수 없습니다 (웹 서비스에서 읽었습니다). 이것은 내 입력 JSON입니다.

{"wrapper":[{"id":"13","name":"Fred"}]}

간단한 사용 사례는 다음과 같습니다.

private void tryReading() {
    String jsonStr = "{\"wrapper\"\:[{\"id\":\"13\",\"name\":\"Fred\"}]}";
    ObjectMapper mapper = new ObjectMapper();
    Wrapper wrapper = null;
    try {
        wrapper = mapper.readValue(jsonStr , Wrapper.class);
    } catch (Exception e) {
        e.printStackTrace();
    }
    System.out.println("wrapper = " + wrapper);
}

내 엔티티 클래스는 다음과 같습니다

public Class Student {
    private String name;
    private String id;
    //getters & setters for name & id here
}

내 래퍼 클래스는 기본적으로 학생들의 목록을 얻는 컨테이너 객체입니다.

public Class Wrapper {
    private List<Student> students;
    //getters & setters here
}

이 오류가 계속 발생하고 “래퍼”가 반환 null됩니다. 무엇이 빠졌는지 잘 모르겠습니다. 누군가 도와주세요?

org.codehaus.jackson.map.exc.UnrecognizedPropertyException:
    Unrecognized field "wrapper" (Class Wrapper), not marked as ignorable
 at [Source: java.io.StringReader@1198891; line: 1, column: 13]
    (through reference chain: Wrapper["wrapper"])
 at org.codehaus.jackson.map.exc.UnrecognizedPropertyException
    .from(UnrecognizedPropertyException.java:53)



답변

Jackson의 클래스 수준 주석을 사용할 수 있습니다.

import com.fasterxml.jackson.annotation.JsonIgnoreProperties

@JsonIgnoreProperties
class { ... }

POJO에 정의하지 않은 모든 속성은 무시합니다. JSON에서 몇 가지 속성을 찾고 전체 매핑을 작성하지 않으려는 경우 매우 유용합니다. Jackson의 웹 사이트 에서 더 많은 정보를 얻을 수 있습니다 . 선언되지 않은 속성을 무시하려면 다음과 같이 작성해야합니다.

@JsonIgnoreProperties(ignoreUnknown = true)


답변

당신이 사용할 수있는

ObjectMapper objectMapper = getObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

선언되지 않은 모든 속성은 무시합니다.


답변

첫 번째 대답은 거의 정확하지만 필요한 것은 필드가 아닌 getter 메소드를 변경하는 것입니다. 필드는 비공개입니다 (자동 감지되지 않음). 더 나아가, getter는 두 필드가 모두 보이는 경우 필드보다 우선합니다.

따라서 getter는 이름을 지정 getWrapper()하거나 다음과 같이 주석을 달아야합니다.

@JsonProperty("wrapper")

getter 메소드 이름을 선호하는 경우.


답변

Jackson 2.6.0을 사용하면 다음과 같이 작동했습니다.

private static final ObjectMapper objectMapper =
    new ObjectMapper()
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

그리고 설정 :

@JsonIgnoreProperties(ignoreUnknown = true)


답변

두 가지 방법으로 달성 할 수 있습니다.

  1. 알려지지 않은 특성을 무시하도록 POJO를 표시하십시오.

    @JsonIgnoreProperties(ignoreUnknown = true)
  2. POJO / json을 직렬화 / 역 직렬화하는 ObjectMapper를 다음과 같이 구성하십시오.

    ObjectMapper mapper =new ObjectMapper();
    // for Jackson version 1.X        
    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    // for Jackson version 2.X
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 

답변

이것은 나를 위해 완벽하게 작동했습니다.

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(
    DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

@JsonIgnoreProperties(ignoreUnknown = true) 주석이 없습니다.


답변

모두보다 낫습니다.이 숙박 시설을 참조하십시오.

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    projectVO = objectMapper.readValue(yourjsonstring, Test.class);