gpt4 book ai didi

java - 如何让 XStream 映射回类型化列表?

转载 作者:行者123 更新时间:2023-11-30 04:32:46 26 4
gpt4 key购买 nike

我正在使用 XStream 将一些 JSON 映射回 Java 对象。我将处理一个可能如下所示的 JSON 字符串:

{
"widgets":[
{
"widget_name": "Kenny",
"widget_type": "Character"
},
"widget_name": "Apple",
"widget_type": "Fruit"
}
]
}

更新:相信这个 JSON 可以解释为:

This JSON represents an un-named object that contains a widgets object. The widgets object, in turn, contains an array of other un-named objects. Each of these un-named objects contain two properties: widget_name and widget_type.

每个Widget在这个widgetlist对应一个POJO:

public class Widget {
private String name;
private String type;

// ...etc.
}

我希望将上面的 JSON 字符串映射回 List<Widget> ,但我似乎无法弄清楚如何正确地为类添加别名:

XStream xs = new XStream();
xs.alias("widgetlist", List.class); // Not a List<Widget> !

如何获得 xs要翻译的映射器 widgetlist进入List<Widget>提前致谢。

最佳答案

这段代码对我有用,但是生成的 JSON 与您的不相似。如果您使用 JsonHierarchicalStreamDriver 而不是 JettisonMappedXmlDriver,您将获得与问题中相同的 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());

JettionMappedXmlDriver生成的XML

{
"widgetlist": {
"widget": [
{
"name": "Kenny",
"type": "Character"
},
{
"name": "Apple",
"type": "Fruit"
}
]
}
}

解释

JSON 是以下 JSON 的 DROP_ROOT_MODE 版本(未命名对象,如果您愿意的话)。因此,您可以将其视为包含列表 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"
}
]
}
}

关于java - 如何让 XStream 映射回类型化列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14248932/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com