Jackson을 사용하여 오버로드된 메서드를 사용하여 JSON을 개체로 역직렬화
Jackson을 사용하여 CouchDb에 저장된 JSON 개체를 역직렬화하려고 합니다.이 개체는 오버로드된 메서드를 포함하는 pojo로 역직렬화해야 합니다.소파에서 오브젝트를 가져와 역직렬화를 시도하면 다음과 같은 예외가 발생합니다.
org.ektorp.DbAccess예외: org.codehouse.jackson.map.Json Mapping Exception:속성 "승수"에 대한 충돌하는 setter 정의: com.db.commodities.framework.sdos.model.보안.EqOpt#setMultiplier(1파라미터)와 com.db.commodities.framework.sdos.model의 비교.보안.EqOpt#setMultiplier(1파라미터)
잭슨이 사용했으면 하는 세터에 주석을 달려고 했지만, 효과가 없었던 것 같습니다.
@JsonProperty("multiplier")
public void setMultiplier(SDOSAttribute multiplier) {
this.multiplier = multiplier;
}
public void setMultiplier(double multiplier) {
this.multiplier.setValue(String.valueOf(multiplier));
}
특정 방법을 사용하여 잭슨이 올바르게 역직렬화하도록 설정하려면 어떻게 해야 합니까?아니면 제가 이 문제에 잘못 접근한 건가요?
편집:
아래와 같이 변경하였습니다.이것은 효과가 있는 것처럼 보이지만, 조금 더 못생겼다.더 좋은 방법이 있다면 언제든지 공유해 주시면 기꺼이 받아들이겠습니다.
@JsonProperty("multiplier")
protected void setMultiplierAttribute(SDOSAttribute multiplier) {
this.multiplier = multiplier;
}
@JsonIgnore
public void setMultiplier(double multiplier) {
this.multiplier.setValue(String.valueOf(multiplier));
}
애매함을 피하기 위해 세터 메서드의 이름을 변경할 필요는 없습니다.그렇지 않으면 당신은 올바른 방향으로 나아가고 있습니다@JsonIgnore
.와 함께@JsonIgnore
같은 이름의 메서드를 모두 무시할 경우 사용하는 메서드는 다음 명령어를 필요로 하지 않습니다.@JsonProperty
주석입니다.
여기 이 점을 보여주는 간단한 예가 있습니다.
input.json: {"value":"forty-two"}
Foo.java:
import java.io.File;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.ObjectMapper;
public class Foo
{
String value;
public String getValue() {return value;}
public void setValue(String value) {this.value = value;}
@JsonIgnore
public void setValue(int value) {this.value = String.valueOf(value);}
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper();
Foo foo = mapper.readValue(new File("input.json"), Foo.class);
System.out.println(mapper.writeValueAsString(foo));
}
}
잭슨 주석을 사용하여 원래의 POJO 정의를 변경하지 않으려면MixIn
.
import java.io.File;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.ObjectMapper;
public class Foo
{
String value;
public String getValue() {return value;}
public void setValue(String value) {this.value = value;}
public void setValue(int value) {this.value = String.valueOf(value);}
public static void main(String[] args) throws Exception
{
ObjectMapper mapper = new ObjectMapper();
mapper.getDeserializationConfig().addMixInAnnotations(Foo.class, IgnoreFooSetValueIntMixIn.class);
Foo foo = mapper.readValue(new File("input.json"), Foo.class);
System.out.println(mapper.writeValueAsString(foo));
}
}
abstract class IgnoreFooSetValueIntMixIn
{
@JsonIgnore public abstract void setValue(int value);
}
Jackson > 2.4 에서는 직접 사용합니다.
mapper.addMixIn(Foo.class, IgnoreFooSetValueIntMixIn.class);
@JsonIgnore가 도움이 되지 않는 경우(현재는 그러한 경우가 있지만 그 이유를 알 수 없음), 대신 @XmlTransient를 사용할 수도 있습니다.
@JsonSetter
public void setMultiplier(SDOSAttribute multiplier) {
this.multiplier = multiplier;
}
public void setMultiplier(double multiplier) {
this.multiplier.setValue(String.valueOf(multiplier));
}
언급URL : https://stackoverflow.com/questions/6346018/deserializing-json-into-object-with-overloaded-methods-using-jackson
'source' 카테고리의 다른 글
create-react-app을 TypeScript와 함께 사용할 수 있습니다. (0) | 2023.03.22 |
---|---|
Angularjs 필터가 null이 아닙니다. (0) | 2023.03.22 |
GSON을 사용하여 목록을 JSON 개체로 변환하는 방법 (0) | 2023.03.22 |
게시물의 URL 접두사 WordPress (0) | 2023.03.22 |
htaccess의 Apache Rewrite Rule - 루트가 끊어졌습니다. (0) | 2023.03.22 |