1

XStreamを使用してJSONをJavaオブジェクトにマップし直しています。次のようなJSON文字列を処理します。

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

更新:このJSONは次のように解釈できると思います:

このJSONは、オブジェクトを含む名前のないオブジェクトを表しwidgetsます。次にwidgets、オブジェクトには、他の名前のないオブジェクトの配列が含まれます。これらの名前のないオブジェクトにはそれぞれ、との2つのプロパティが含まれていwidget_nameますwidget_type

WidgetこれのそれぞれはwidgetlistPOJOに対応します:

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>ですか?前もって感謝します。

4

1 に答える 1

2

このコードはうまくいきましたが、生成された JSON はあなたが持っているものと似ていません。JsonHierarchicalStreamDriverの代わりにを使用するJettisonMappedXmlDriverと、質問と同じ JSON が得られます。これの欠点は、 がJsonHierarchicalStreamDriverJSON を読み取ることができず、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());

によって生成された XMLJettionMappedXmlDriver

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

解釈

JSON はDROP_ROOT_MODE、以下の JSON のバージョンです (必要に応じて、名前のないオブジェクト)。したがって、のリスト を含む名前のないオブジェクトと見なすことができますWidgetWidgetオブジェクトは、質問で説明されているものと同じ構造を持っています。

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 に答える