由于您没有提供架构,因此很难猜测模型的某些部分。特别是,很难猜出field 模型。所以我将把它反序列化成一个JsonNode,一个可以处理几乎所有事情的动态对象。 JsonIgnoreProperties 以防万一你有一些额外的字段,这里没有提到。
首先,创建一些数据类:
@XmlRootElement(name = "xyz-objects")
@JsonIgnoreProperties(ignoreUnknown = true)
data class XyzObjects(
@JacksonXmlProperty(isAttribute = true)
val version: String,
@JsonProperty(value = "object")
@JacksonXmlElementWrapper(useWrapping = false)
val objects: List<Object>
)
@XmlRootElement(name = "object")
@JsonIgnoreProperties(ignoreUnknown = true)
data class Object(
@JacksonXmlProperty(isAttribute = true)
val pk: String,
@JacksonXmlProperty(isAttribute = true)
val model: String,
@JsonProperty(value = "field")
@JacksonXmlElementWrapper(useWrapping = false)
val fields: List<JsonNode>
)
回答您的问题:您可以使用JacksonXmlProperty 的isAttribute 属性来处理属性。列表可以用JacksonXmlElementWrapper + JsonProperty 处理(不要被名称所迷惑,它用于处理名称中的复数,从而使它们在 XML 中也更易于阅读)。
为了能够使用数据类,您需要将Kotlin module 注册到registerKotlinModule:
val text = """<xyz-objects version="1.0">
<object pk="1" model="roll">
<field type="BigIntegerField" name="roll_number">1000000714</field>
<field type="CharField" name="status">DL</field>
<field name="scans">
<object pk="1" model="scan_stages">
<field type="DateTimeField" name="updated_on">11 Jul, 2017, 17:40</field>
</object>
</field>
</object>
</xyz-objects>"""
val mapper = XmlMapper().registerKotlinModule()
val node = mapper.readValue<XyzObjects>(text)
println(node)
它将打印:
XyzObjects(version=1.0, objects=[Object(pk=1, model=roll, fields=[{"type":"BigIntegerField","name":"roll_number","":"1000000714"}, {"type":"CharField","name":"status","":"DL"}, {"name":"scans","object":{"pk":"1","model":"scan_stages","field":{"type":"DateTimeField","name":"updated_on","":"11 Jul, 2017, 17:40"}}}])])