1

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

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

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

此 JSON 表示包含对象的未命名widgets对象。反过来,该widgets对象包含一组其他未命名的对象。这些未命名的对象中的每一个都包含两个属性:widget_namewidget_type

这里的每一个都Widget对应widgetlist一个 POJO:

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

    // ...etc.
}

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

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

我怎样才能让xs映射器翻译widgetlist成一个List<Widget>提前致谢。

4

1 回答 1

2

这段代码对我有用,但是生成的 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"
            }
        ]
    }
}
于 2013-01-10T01:01:03.053 回答