2

XStream を使用して XML をドメイン オブジェクトに変換していますが、問題が発生しました。いくつかの詳細を省略すると、XML は次のようになります。

<airport>
    <flights>
        <flight>.....</flight>
        <flight>.....</flight>
        <flight>.....</flight>
    </flights>
</airport>

0 から N 個flightの要素を指定できます。飛行要素自体には他の要素が含まれています。空港、フライト、およびフライトのクラスを作成し、それらを xstream.alias 関数に登録しました。

xstream = new XStream();
xstream.alias("airport", AirportPojo.class);
xstream.alias("flights", FlightsPojo.class);
xstream.alias("flight", FlightPojo.class);
xstream.useAttributeFor(AirportPojo.class, "flights");
xstream.addImplicitCollection(FlightsPojo.class, "flights", FlightPojo.class);
AirportPojo airportPojo = (AirportPojo) xstream.fromXML(xml);

したがって、変換後、これは FlightPojo オブジェクトのコレクションを含む、FlightsPojo オブジェクトを含む AirportPojo オブジェクトを取得します。ただし、飛行要素が0個の場合、FlightPojosのコレクションはnull. 私はリストが初期化されることを期待します(そしてそれを好みます)が、その中に要素がありません。どうすればこれを達成できますか? これはレガシー プロジェクトであるため、注釈を使用できないことに注意してください。

4

2 に答える 2

1

カスタムコンバーターを実装するのはどうですか?

class FlightsConverter implements Converter {
    @Override
    public boolean canConvert(Class clazz) {
        return clazz.equals(FlightsPojo.class);
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        FlightsPojo flightsPojo = new FlightsPojo();
        flightsPojo.setFlights(new ArrayList<FlightPojo>());
        while (reader.hasMoreChildren()) {
            reader.moveDown();
            FlightPojo flightPojo = (FlightPojo) context.convertAnother(flightsPojo, FlightPojo.class);
            flightsPojo.getFlights().add(flightPojo);
            System.out.println(reader.getValue());
            reader.moveUp();
        }
        return flightsPojo;
    }

    @Override
    public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
        // todo...
    }
}

そして、次のようにフックします。

    XStream xstream = new XStream();
    xstream.registerConverter(new FlightsConverter());
    xstream.alias("airport", AirportPojo.class);
    xstream.alias("flights", FlightsPojo.class);
    xstream.alias("flight", FlightPojo.class);
    xstream.useAttributeFor(AirportPojo.class, "flights");
    AirportPojo airportPojo = (AirportPojo) xstream.fromXML(xml);

お役に立てれば ;)

于 2013-10-23T07:21:35.930 に答える
0

XStream は暗黙的なコレクションをこのように処理できないようです。 XStream の FAQ のこの部分を参照してください。

于 2013-10-23T06:59:36.967 に答える