我有以下课程
@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>test@gmail.com</Value>
</Entry>
</Entries>
</Root>
如果从getProperty()
返回的JSON是:
{ "Age": 35, "Email": "test@gmail.com" }
我试图创建一个帮助类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]的值。指定的对象不是声明基础字段“
”的类或接口的实例
我如何让这个工作?是否有更简单的方法来实现这一目标?
答案 0 :(得分:2)
而不是:
public static class JsonXmlAdapter extends XmlAdapter<XmlJsonEntry[], JsonObject>
执行:
public static class JsonXmlAdapter extends XmlAdapter<XmlJsonEntries, JsonObject>
然后让XmlJsonEntries
具有List<XmlJsonEntry>
类型的映射属性。