这段代码对我有用,但是生成的 JSON 与您拥有的不同。如果您使用 theJsonHierarchicalStreamDriver
而不是 theJettisonMappedXmlDriver
您将获得与您的问题相同的 JSON。这样做的缺点是JsonHierarchicalStreamDriver
无法读取 JSON,UnsupportedOperationException
如果您尝试会给出。
XStream xstream = new XStream(new JettisonMappedXmlDriver());
xstream.setMode(XStream.NO_REFERENCES);
xstream.alias("widgetlist", List.class);
xstream.alias("widget", Widget.class);
List<Widget> widgetlist = new ArrayList<Widget>();
Widget w1 = new Widget("Kenny", "Character");
Widget w2 = new Widget("Apple", "Fruit");
widgetlist.add(w1);
widgetlist.add(w2);
String serialized = xstream.toXML(widgetlist);
System.out.println(serialized);
List<Widget> unserialized = (List<Widget>)xstream.fromXML(serialized);
System.out.println("Size: "+unserialized.size());
生成的 XML 由JettionMappedXmlDriver
{
"widgetlist": {
"widget": [
{
"name": "Kenny",
"type": "Character"
},
{
"name": "Apple",
"type": "Fruit"
}
]
}
}
解释
JSON 是DROP_ROOT_MODE
以下 JSON 的版本(如果您愿意,可以选择未命名的对象)。因此,您可以将其视为一个未命名的对象,其中包含 Widget
. 该Widget
对象仍然具有与问题中描述的相同的结构。
public class WidgetList {
List<Widget> widgets;
public WidgetList() {
this.widgets = new ArrayList<>();
}
}
Xstream 设置
xstream.setMode(XStream.NO_REFERENCES);
xstream.alias("widgets", List.class);
xstream.addImplicitCollection(WidgetList.class, "widgets");
xstream.alias("widgets", Widget.class);
xstream.alias("widgetsL", WidgetList.class);
JSON 输出
{
"widgetsL": {
"widgets": [
{
"name": "Kenny",
"type": "Character"
},
{
"name": "Apple",
"type": "Fruit"
}
]
}
}