【发布时间】:2015-10-27 11:09:41
【问题描述】:
我正在尝试使用 Scala 中的 Xstream 将 Option[T] 类型的对象转换为 XML。我有一个这样的案例类:
case class MyModel(promos: Option[Promos])
如果选项是Some(Promo),我希望它渲染
<MyModel>
<Promos>
<promoField1>value</promoField1>
<promoField2>value</promoField2>
</Promos>
</MyModel>
如果选项是None,我希望它渲染
<MyModel>
<Promos/>
</MyModel>
到目前为止,在我的解决方案中,我已经注册了一个转换器:
xstream.registerConverter(new OptionConverter(xstream.getMapper))
然后我有一个如下所示的自定义转换器:
private [xml] class OptionConverter(_mapper: Mapper) extends AbstractCollectionConverter(_mapper: Mapper) {
override def marshal(source: scala.Any, writer: HierarchicalStreamWriter, context: MarshallingContext): Unit = {
val opt = source.asInstanceOf[Option[_]]
for (value <- opt) {
writeItem(value, context, writer)
}
}
override def unmarshal(reader: HierarchicalStreamReader, context: UnmarshallingContext): AnyRef = {
throw new UnsupportedOperationException
}
override def canConvert(clazz: Class[_]): Boolean = {
clazz.isAssignableFrom(classOf[Some[_]]) || clazz.isAssignableFrom(None.getClass)
}
}
None 工作正常,但 Some(promo) 输出如下:
<Promos>
<com.mymodel.Promos>
<promoField1>value</promoField1>
<promoField2>value</promoField2>
</com.mymodel.Promos>
</Promos>
问题是,正在为我的 Option/Some 字段输出 Promos,然后为 Some 中的嵌套值输出“com.mymodel.Promos”。 Some(value)有没有办法变平?
【问题讨论】: