【问题标题】:Jackson XML problems on Serializing关于序列化的 Jackson XML 问题
【发布时间】: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


【解决方案1】:

这可能会有所帮助。

JacksonXmlModule module = new JacksonXmlModule();
module.setDefaultUseWrapper(false);
XmlMapper mapper = new XmlMapper(module);

【讨论】:

    猜你喜欢
    • 2018-10-26
    • 2021-12-31
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    相关资源
    最近更新 更多