2

使用 FasterXML Jackson 的对象映射器功能,我想解析这个 XML 片段:

<?xml version="1.0" encoding="utf-8"?>
<categories>
  <category name="A">
    <category name="B">
      <setting type="Float">
        <name>Bar</name>
      </setting>
    </category>
    <setting type="Float">
      <name>Foo</name>
    </setting>
    <category name="C">
      <setting type="Float">
        <name>Baz</name>
      </setting>
    </category>
  </category>
</categories>

使用以下 Scala 代码:

case class Categories(@JacksonXmlProperty(localName = "category") categories: List[Category])
case class Category(name: String, @JacksonXmlProperty(localName = "category") categories: List[Category], @JacksonXmlProperty(localName = "setting") settings: List[Setting])
case class Setting(`type`: String, name: String)

val xmlMapper = new XmlMapper()
xmlMapper.registerModule(DefaultScalaModule)
xmlMapper.setDefaultUseWrapper(false)

val categories = xmlMapper.readValue(snippet, classOf[Categories])
println(categories)
// Categories(List(Category(A,List(Category(C,null,List(Setting(Float,Baz)))),List(Setting(Float,Foo)))))

我可以看到结果中缺少 B 类。如果我更改顺序并setting在类别之后移动,它会按预期工作。

// Categories(List(Category(A,List(Category(B,null,List(Setting(Float,Bar))), Category(C,null,List(Setting(Float,Baz)))),List(Setting(Float,Foo)))))

<?xml version="1.0" encoding="utf-8"?>
<categories>
  <category name="A">
    <category name="B">
      <setting type="Float">
        <name>Bar</name>
      </setting>
    </category>
    <category name="C">
      <setting type="Float">
        <name>Baz</name>
      </setting>
    </category>
    <setting type="Float">
      <name>Foo</name>
    </setting>
  </category>
</categories>

因此,如果子列表混合在一起,它似乎会跳过元素。我可以在 Mapper 上设置一个属性来解决这个问题吗?

4

0 回答 0