【发布时间】:2016-10-06 09:56:08
【问题描述】:
我在序列化抽象对象列表时遇到问题,杰克逊在标签上重复包装器。
这是我得到的一些结果:
<visibility>
<allowed/>
<autoSubscribed>
<autoSubscribed>
<regex attribute="isMemberOf" pattern="\Qxertif\E"/>
</autoSubscribed>
</autoSubscribed>
<obliged>
<obliged>
<regex attribute="isMemberOf" pattern="\QQadddsssss\E"/>
</obliged>
<obliged>
<regex attribute="isMemberOf" pattern="\Qabcdef\E"/>
</obliged>
</obliged>
</visibility>
或者当我从我的抽象类中删除 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT, visible = true) 时:
<visibility>
<allowed/>
<autoSubscribed>
<autoSubscribed attribute="isMemberOf" pattern="\Qxertif\E"/>
</autoSubscribed>
<obliged>
<obliged attribute="isMemberOf" pattern="\QQadddsssss\E"/>
<obliged attribute="isMemberOf" pattern="\Qabcdef\E"/>
</obliged>
</visibility>
这几乎是好的,但我想要标签中的类型。 类似:
<visibility>
<allowed/>
<autoSubscribed>
<regex attribute="isMemberOf" pattern="\Qxertif\E"/>
</autoSubscribed>
<obliged>
<regex attribute="isMemberOf" pattern="\QQadddsssss\E"/>
<regex attribute="isMemberOf" pattern="\Qabcdef\E"/>
</obliged>
</visibility>
这是我的对象:
@Data // from lombok
public class Visibility implements Serializable {
private List<VisibilityAbstract> allowed = new ArrayList<>();
private List<VisibilityAbstract> autoSubscribed = new ArrayList<>();
private List<VisibilityAbstract> obliged = new ArrayList<>();
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT, visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = VisibilityGroup.class, name = "group"),
@JsonSubTypes.Type(value = VisibilityRegex.class, name = "regex"),
@JsonSubTypes.Type(value = VisibilityRegular.class, name = "regular")
})
public abstract class VisibilityAbstract implements Serializable {
}
@Data
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT, visible = true)
@JsonTypeName(value = "group")
public class VisibilityGroup extends VisibilityAbstract implements Serializable {
@NonNull
@JacksonXmlProperty(isAttribute = true)
private String name;
}
所有“扩展”类都有不同的属性,但配置类似于 VisibilityGroup。
我使用 spring boot 1.2.2 和 jackson 2.4.6 和 woodstox 4.4.1。
在 Json 上一切都很好,但在 XML 中却不行。
关于如何解决问题的任何想法?
谢谢
【问题讨论】:
-
尝试删除 JsonTypeInfo.As.WRAPPER_OBJECT
-
虽然不是直接的解决方案,但我建议尝试更新的 Jackson 版本(理想情况下为 2.7.4),因为自 2.4 以来已经对 XML 处理进行了一些修复。至于解决方案,您需要使用
@JacksonXmlElementWrapper(useWrapping=false)禁用List值的“包装”。在XmlMapper中还有一个设置,可以将换行的默认值更改为 false。 -
@reos :这无济于事,它得到了很好的方法,但孩子的标签名称不好。我得到:
-
@StaxMan:我想要包装器,因为我需要列表值的父标记
,但我不想要列表中每个值的包装器 -
与 spring-boot 1.2.8 和 jackon 2.7.4 的行为相同,问题是 list 的所有值都被包装了
标签: java spring jackson jackson-dataformat-xml