2015-01-02 2 views
1

가지고 다음과 같은 클래스가 포함되어 있지 않습니다. 이 문제를 해결하는 방법?잭슨 유형 ID가 생성 JSON에

EDIT : 마지막으로 나는 릴리스 2.3.0 이후에 도입 된 JsonTypeInfo.As.EXISTING_PROPERTY을 사용했습니다. 실제 유형을 결정하기 위해 기존 등록 정보를 사용합니다.

답변

1

지우기 유형이 TrackedChange.tracked 인 경우 문제가 발생합니다. 런타임시 유형이 없어 지므로 유형이 손실되고 Jackson 직렬 기가 유형을 판별 할 수 없으므로이를 B으로 인식하지 않고 @JsonTypeInfo을 찾지 못합니다. 따라서 런타임에 Jackson은 TrackedChange.tracked을 입력하여 Object 유형으로 읽습니다.

잭슨에서 유형 삭제를 완화하는 다양한 방법이 있지만 일반적으로 컬렉션의 제네릭 주위에 있습니다. (이

ObjectMapper mapper = new ObjectMapper(); 
TypeResolverBuilder<?> typer = new ObjectMapper.DefaultTypeResolverBuilder(ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE); 
typer = typer.init(JsonTypeInfo.Id.CLASS, null); 
typer = typer.inclusion(JsonTypeInfo.As.PROPERTY); 
typer = typer.typeProperty("type"); 
mapper.setDefaultTyping(typer); 

이 직렬화하는 동안 개체와 콘크리트가 아닌 유형에 대한 유형 매퍼 구성을 등록합니다 :

기본적으로 내가 볼 수있는 그 목표를 달성하기위한 하나의 방법이, 당신은 다음과 같이 ObjectMapper 구성 할 수 있습니다 TrackedChange.tracked 사례를 다룹니다. 안타깝게도이 구성이 예제에서와 같이 일치하는 b_type 이름을 사용한다는 사전 등록 방법이 없습니다.

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "type") 

은 다음과 같이 당신에게 출력주기 :

{ 
    "type" : "so.json.typeinfo.B", 
    "trackChange" : { 
    "tracked" : { 
     "type" : "so.json.typeinfo.B", 
     "trackChange" : null, 
     "aFoo" : "aFoo", 
     "bFoo" : "bFoo" 
    } 
    }, 
    "aFoo" : "aFoo", 
    "bFoo" : "bFoo" 
} 
+0

덕분에 내가 가진 최고의 제안은 위의 구성 동작을 일치 ​​다음을 사용하는 클래스의 구성을 변경하는 것입니다! JsonTypeInfo.Id.CLASS를 JsonTypeInfo.Id.NAME으로 변경했고 예상대로 작동하기 시작했습니다. – tiktak