作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试应用 http://programmerbruce.blogspot.com/2011/05/deserialize-json-with-jackson-into.html 上的内容)\,并将其应用于我一直在做的事情。虽然它非常适合我将在 JSON 结构中称为“外部”元素的内容,但我遇到了一个令人沮丧的问题,即没有太多文档。
首先,我的代码有点像下面这样:
interface Parameters {
// Couple random properties -- no problem here
SubTypeParameters getSubTypeParameters(); // where SubTypeParameters are polymorphic
void setSubTypeParameters(SubTypeParameters value);
}
@JsonSubTypes({
@JsonSubTypes.Type(name = "a", value = ASubTypeParameters.class),
@JsonSubTypes.Type(name = "b", value = BSubTypeParameters.class)
})
interface SubTypeParameters {
String getValue();
void setValue(String value);
}
@JsonTypeName(value = "a")
class ASubTypeParameters implements SubTypeParameters {
// getter/setter implemented
}
@JsonTypeName(value = "b")
class BSubTypeParameters implements SubTypeParameters {
// getter/setter implemented
}
{
// other properties corresponding to the Parameters object
"a": {
"value": "value for a"
}
}
{
// other properties corresponding to the Parameters object
"b": {
"value": "value for b"
}
}
ObjectMapper mapper = new ObjectMapper();
StdDeserializer<Parameters> parameterDeserializer = new ParameterDeserializer();
SimpleModule module = new SimpleModule ( ... ); // simplifying this--no problem here
module.addDeserializer(Parameters.class, parameterDeserializer);
mapper.registerModule(module);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.registerSubtypes(ASubTypeParameters.class, BSubTypeParameters.class)
mapper.registerSubtypes(
new NamedType(ASubTypeParameters.class, "a"),
new NamedType(BSubTypeParameters.class, "b")
);
最佳答案
使用 Jackson,您可以配置为使用以下注释将类型信息存储为单个字段的名称:@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT)
.结果应该类似于您的 JSON 示例。
我稍微修改了你的代码来演示它:
public class JacksonPolymorphic2 {
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
@JsonSubTypes.Type(name = "a", value = ASubTypeParameters.class),
@JsonSubTypes.Type(name = "b", value = BSubTypeParameters.class)
})
interface SubTypeParameters {
String getValue();
void setValue(String value);
}
@JsonTypeName(value = "a")
static class ASubTypeParameters implements SubTypeParameters {
ASubTypeParameters(String value) {
this.value = value;
}
private String value;
@Override
public String getValue() {
return value;
}
@Override
public void setValue(String value) {
this.value = value;
}
}
@JsonTypeName(value = "b")
static class BSubTypeParameters implements SubTypeParameters {
BSubTypeParameters(String value) {
this.value = value;
}
private String value;
@Override
public String getValue() {
return value;
}
@Override
public void setValue(String value) {
this.value = value;
}
}
public static void main(String[] args) throws JsonProcessingException {
ASubTypeParameters a = new ASubTypeParameters("aType");
BSubTypeParameters b = new BSubTypeParameters("bType");
List<? super SubTypeParameters> list = new ArrayList<>();
list.add(a);
list.add(b);
ObjectMapper mapper = new ObjectMapper();
System.out.printf(mapper
.writerWithType(new TypeReference<List<SubTypeParameters>>() {})
.withDefaultPrettyPrinter()
.writeValueAsString(list));
}
}
[ {
"a" : {
"value" : "aType"
}
}, {
"b" : {
"value" : "bType"
}
} ]
关于json - Jackson JSON 多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15624950/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!