programing

Jackson Json Type Info 。As.EXTERNAL_PROPERTY가 예상대로 작동하지 않습니다.

newsource 2023. 2. 15. 22:06

Jackson Json Type Info 。As.EXTERNAL_PROPERTY가 예상대로 작동하지 않습니다.

나는 내가 통제할 수 없는 JSON을 해석하기 위해 잭슨을 이용하고 있다.JSON은 다음과 같습니다.

{
    "status":"0"
    "type":"type1"
    "info": {
       // additional fields
    }
}

우리 반은 이렇게 생겼다.

public class Response {
    private String status;
    private String type;
    private Info info
}

사용하는 정보의 하위 클래스는 유형 속성에 따라 다르므로 정보에 대한 매핑은 다음과 같습니다.

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type")
@JsonSubTypes(value = {
        @JsonSubTypes.Type(value = Type1Info.class, name = "type1"),
        @JsonSubTypes.Type(value = Type2Info.class, name = "type2") })
public abstract class Info {
    // some fields
}

식별 요소가 캐스트해야 하는 요소와 동일한 수준일 때 유형 정보를 사용하는 올바른 방법입니다.하지만 이 방법은 작동하지 않습니다. 항상 같은 오류가 발생합니다.

com.sysml.syslog.syslogind.syslogindJson Mapping Exception:예기치 않은 토큰(END_OBJECT)입니다. FILD_NAME: 유형 ID를 포함할 속성 'type'이 없습니다.

EXTERNAL_PROPERTY를 PROPERTY로 변경해도 같은 에러가 발생합니다.EXTERNAL_PROPERTY에 대한 이해가 잘못된 건가요?

자바독에서:

속성을 입력할 JSON 개체와 동일한 수준의 형제 속성으로 계층에서 한 단계 더 높게 포함한다는 점을 제외하면 포함 메커니즘이 PROPERTY와 유사합니다.선택사항은 속성에만 사용할 수 있으며 유형(클래스)에는 사용할 수 없습니다.수업에서 사용하려고 하면 대신 기본 PROPERTY의 포함 전략이 발생합니다.

can only be used for properties굵은 글씨로 표시됩니다.출처: Json Type Info.As.EXTERNAL_PROPERTY.

모든 .Info으로 info ★★★★★★★★★★★★★★★★★」setInfo in the method in the method in 。Response를 누릅니다

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type")
@JsonSubTypes(value = { @JsonSubTypes.Type(value = Type1Info.class, name = "type1"),
        @JsonSubTypes.Type(value = Type2Info.class, name = "type2") })
public void setInfo(Info info) {
    this.info = info;
}

같은 엔 지우고, 지우고, , 지우고, 지우고, 지우고, 지우고.type property の の from property 。Response클래스. 시리얼화 프로세스 중에 동적으로 생성됩니다.탈직렬화에서 잭슨은 유형을 신경 쓰기 때문에 당신은 그것을 필요로 하지 않는다.츠키다

class Response {

    private String status;
    private Info info;

    //getters, setters
}

JSON 네스트클래스의 데이터 바인딩도 참조해 주세요.

AutoValue 또는 기타 소스 코드 생성기를 사용하는 모든 사용자에게 @JsonTypeInfo@JsonSubTypes 주석은 추상 메서드에 주석을 달 때 작동하지 않습니다(생성된 코드에서 실제 속성을 반환합니다).이렇게 하면 다음과 같은 예외가 발생합니다.com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of [xxx] (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information

또한 메서드에서 @JsonCreator로 주석을 달면 매개 변수에 주석을 달지 않습니다.이렇게 하면 다음과 같은 이상한 예외가 발생합니다.com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (START_OBJECT), expected START_ARRAY: need JSON Array to contain As.WRAPPER_ARRAY type information for class [xxx]

클래스에하지 않도록 , 「소스코드 생성기」를 .Response공통 잭슨 주석을 사용하는 오브젝트: @JsonCreator, @JsonProperty@JsonTypeInfo, @JsonSubTypes

Jackson 2.10.5로 테스트 완료

언급URL : https://stackoverflow.com/questions/18757431/jackson-jsontypeinfo-as-external-property-doesnt-work-as-expected