【问题标题】:xstream flatten an objectxstream 展平一个对象
【发布时间】:2023-04-22 12:47:01
【问题描述】:

我正在尝试使用转换器/封送处理来展平 xstream 的 xml 输出,但没有成功。例如,

public class A{
    public B b;
    public int F;
    public String G; 
}

public class B{
    public String C;
    public String D;
    public int E;
}

输出为

<A>
  <B>
     <C></C>
     <D></D>
     <E></E>
  </B>
  <F></F>
  <G></G>
</A>

但我需要

<A>
  <C></C>
  <D></D>
  <E></E>
  <F></F>
  <G></G>
</A>

这可能吗?如何摆脱B? (C、D、E 是唯一命名的)。谢谢。 到目前为止,我的尝试是

...    
public void marshal(Object value, HierarchicalStreamWriter writer,
    MarshallingContext context)
{
    B b = (B) value;
    writer.startNode("C");
    writer.setValue(b.getC());
    writer.endNode();

    writer.startNode("D");
    writer.setValue(b.getD());
    writer.endNode();

    writer.startNode("E");
    writer.setValue(b.getE());
    writer.endNode();
}

【问题讨论】:

    标签: java xml xml-serialization xstream


    【解决方案1】:

    根据您与 XStream 的联系程度,您可以在 EclipseLink MOXy 中使用 @XmlPath 注释很容易地做到这一点:

    public class A{ 
        @XmlPath(".") public B b; 
        public int F; 
        public String G;  
    } 
    
    public class B{ 
        public String C; 
        public String D; 
        public int E; 
    } 
    

    有关 MOXy 基于 XPath 的映射的信息,请参阅:

    【讨论】:

    • 谢谢,但在将现有代码切换到 MOXy 之前,我希望在 XStream 中找到同样好的解决方案(我只是不知道)
    • 没问题,当你想移植时,请随时与我联系:)。
    • 查看我的比较 JAXB 和 XStream 的博文:bdoughan.blogspot.com/2010/10/…
    【解决方案2】:

    我找到了一个临时解决方案,虽然它不是最好的。

    如果我将我的 canConvert 函数设置为检查周围的对象 A 而不是 B,我可以操纵整个内部对象。

    public boolean canConvert(Class c)
    {
        return A.class == c;
    }
    

    因为我必须定义所有的 A 类,所以这需要更多的工作(尤其是在一个真正的 XML 对象中,而不是我设计的示例中)。 有谁知道仅在内部类 B 上使用 Converter 获得相同结果的方法?

    public boolean canConvert(Class c)
    {
        return B.class == c;
    }
    

    【讨论】: