我有以下课程

@XmlRootElement(name = "Root")
class MyClass {

    @XmlElement(name = "Entries")
    JsonObject getProperty() { ... }
}


编组后,我希望获得以下XML输出:

<Root>
  <Entries>
  <Entry>
    <Name>Age</Name>
    <Value>35</Value>
  </Entry>
  <Entry>
    <Name>Email</Name>
    <Value>[email protected]</Value>
  </Entry>
 </Entries>
</Root>


前提是从getProperty()返回的JSON是:

{ "Age": 35, "Email": "[email protected]" }

我试图创建一个帮助类XmlJsonEntry

@XmlAccessType(XmlAccessType.FIELD)
@XmlRootElement(name = "Entry")
class XmlJsonEntry {
   @XmlElement
   public String Name;
   @XmlElement
   public String Value;
}


并扩展XmlAdapter,如下所示:

public static class JsonXmlAdapter extends XmlAdapter<XmlJsonEntry[], JsonObject>
{

    @Override
    public XmlJsonEntry[] marshal(JsonObject v) throws Exception
    {
        List<XmlJsonEntry> entries = new ArrayList<XmlJsonEntry>();
        for (Entry<String,JsonElement> e : v.entrySet())
        {
            entries.add(new XmlJsonEntry(e.getKey(),e.getValue().toString()));
        }
        return entries.toArray(new XmlJsonEntry[entries.size()]);
    }

    @Override
    public JsonObject unmarshal(XmlJsonEntry[] v) throws Exception
    { throw new Exception("Unmarshall not supported."); }

}


但这在编组期间引发了异常:


  试图从对象[[Lmy.app。$ XmlJsonEntry;]]中获取类型为[java.lang.String]的实例变量[name]的值。指定的对象不是声明基础字段的类或接口的实例。


我该如何工作?也许有一些更简单的方法来实现这一目标?

最佳答案

代替:

public static class JsonXmlAdapter extends XmlAdapter<XmlJsonEntry[], JsonObject>


做:

public static class JsonXmlAdapter extends XmlAdapter<XmlJsonEntries, JsonObject>


然后让XmlJsonEntries具有类型为List<XmlJsonEntry>的映射属性。

07-24 09:38