【问题标题】:Parse xml file with multiple elements via jackson通过杰克逊解析具有多个元素的xml文件
【发布时间】:2020-08-10 17:21:18
【问题描述】:

我有一个这样的 xml 文件:

<TABLES>
<TABLE NAME="abcd" TIME="2013.05.27 00:00:00" >
<LINES>
<LINE TIME="2013.05.27 00:00:00" BEGINE="787465" END="787465"/>
</LINES>
<SPECIAL>
<DAY MASK="128" DATE="16714778" />
<WEEK NAME="abcde" PARAM="128" />
</SPECIAL> 
</TABLE>
</TABLES>

问题是,SPECIAL 标签内有两种类型的元素DAYWEEK。我无法通过杰克逊解析它,有什么特殊的方法来处理它吗?我可以毫无问题地通过 POJO 解析其余部分,但特殊情况下我需要设置 2 个不同的类

// DAY
class SPECIAL(
    @JacksonXmlProperty(localName = "MASK")
    val mask: String,

    @JacksonXmlProperty(localName = "DATE")
    val date: Int,
)

// WEEK
class SPECIAL(
    @JacksonXmlProperty(localName = "NAME")
    val name: String,

    @JacksonXmlProperty(localName = "PARAM")
    val param: Int,
)

【问题讨论】:

    标签: android xml jackson xml-parsing jackson-dataformat-xml


    【解决方案1】:

    Special 有两个不同的标签 DAYWeek 所以你可以将它们分成两个 POJO 类

    data class DAY(@JacksonXmlProperty(localName = "Date") val date: String, @JacksonXmlProperty(localName = "MASK")val mask: String)
    
    data class WEEK(@JacksonXmlProperty(localName = "PARAM") val param: String,@JacksonXmlProperty(localName = "Name") val name: String)
    

    并在 SPECIAL 类中将它们用作:

    data class SPECIAL(@JacksonXmlProperty(localName = "WEEK") val week: WEEK, @JacksonXmlProperty(localName = "DAY") val day: DAY)
    



    要使SPECIAL 字段可选,请在TABLE 类中使用? 将该字段标记为可为空:

    data class TABLE(
        @JacksonXmlProperty(localName = "SPECIAL") val special: SPECIAL?,
        @JacksonXmlProperty(localName = "NAME") val name: String,
        @JacksonXmlProperty(localName = "TIME") val time: String
    )
    

    SPECIAL 类为

    data class SPECIAL(
        @JacksonXmlProperty(localName = "WEEK") var week: WEEK?,
        @JacksonXmlProperty(localName = "DAY") var day: DAY?
    )
    

    View Complete Source Code

    【讨论】:

    • 好的,我确实喜欢建议的星期或日期不是强制性的,所以我将它们设为可选,但后来出现错误无法识别的字段,未标记为可忽略。当我用 @JsonIgnoreProperties(ignoreUnknown = true) 注释分类时,解析完成,没有错误,特殊对象的数量是正确的,但在所有这些对象中,DAY 和 WEEK 始终为空
    • @maxxxo @JsonIgnoreProperties(ignoreUnknown = true) 将避免序列化和反序列化,因此最好将@JsonInclude(Include.NON_NULL) 用于可选值,并将var 与可空字段var day: DAY? = null 一起使用。虽然最好在有问题时提及要求或发布另一个问题
    • 我尝试了包含注释和选项,但没有帮助,这是错误:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "NAME" (class .Special ),未标记为可忽略(4 个已知属性:“DAY”、“WEEK”、“day”、“week”])在 [Source: (StringReader); line: 26, column: 58] (通过引用链: >.Table["SPECDAYS"]->java.util.ArrayList[0]->*.SpecDay["NAME"]) 主要问题是in Special Jackson 期望属性来自 Day/Week 而不是 Day/Week。我也尝试设置 isAttribute = true 但没有改变
    • 当我将参数从 Day 和 Week 复制到 Special 时,它工作正常
    猜你喜欢
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 2019-07-27
    • 2018-08-25
    • 2014-08-22
    • 2019-11-25
    相关资源
    最近更新 更多