는 다음과 같은 예를 생각해기본 입력으로 명명 된 형식을 deserialize하도록 Jackson을 구성하는 방법은 무엇입니까?
package com.example;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;
public class JacksonDeserializationOfNamedTypes {
public static void main(String[] args) throws Exception {
ObjectMapper jackson = new ObjectMapper();
jackson.enableDefaultTypingAsProperty(DefaultTyping.JAVA_LANG_OBJECT, "@type");
Balloon redBalloon = new Balloon("red");
String json = jackson.writeValueAsString(redBalloon); //{"@type":"Balloon","color":"red"}
//assume the JSON could be anything
Object deserialized = jackson.readValue(json, Object.class);
assert deserialized instanceof Balloon;
assert redBalloon.equals(deserialized);
}
@JsonTypeName("Balloon")
@JsonTypeInfo(use = Id.NAME)
public static final class Balloon {
private final String color;
//for deserialization
private Balloon() {
this.color = null;
}
public Balloon(final String color) {
this.color = color;
}
public String getColor() {
return color;
}
@Override
public boolean equals(final Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
final Balloon other = (Balloon) obj;
return this.color.equals(other.color);
}
@Override
public int hashCode() {
int result = color.hashCode();
result = 31 * result + color.hashCode();
return result;
}
@Override
public String toString() {
return color + " balloon";
}
}
}
직렬화 복원은 다음을 제외하고 런타임에 실패
: Exception in thread "main" java.lang.IllegalArgumentException: Invalid type id 'Balloon' (for id type 'Id.class'): no such class found
생성 된 JSON 확실히 잭슨이 제대로 유형을 결정하는 데 필요한 모든 정보를 가지고, 어떻게 내가 할 수있는 "Balloon"
을 com.example.JacksonDeserializationOfNamedTypes$Balloon
에 올바르게 매핑하도록 ObjectMapper를 구성 하시겠습니까?
'는 이름을 풍선으로 무엇을 할 수'글쎄, 난 '? m 클래스의 클래스 경로를 검사하여 * 자신의 * 주석으로 태그가 붙은 잭슨을 구성하고 Balloon 클래스에 @JsonTypeName ("Balloon") 태그가 붙어 있는지 확인하는 방법이 있기를 바랍니다. – Andrey
나는 또한 시도했습니다. 'NamedType (Balloon.class, "Balloon")'을 전달함으로써'ObjectMapper # registerSubtypes'를 가지고 놀았습니다. 그것은 또한 작동하지 않았다. 다시 말하면, 질문의 주요 목표는 기본 유형 * (즉, Object.class 지정)을 모른 채 *를 역 직렬화하는 방법입니다. – Andrey