1

私は、API を使用してデータを取得する Android プロジェクトに取り組んでいます。まず第一に、API は既にリリースされている iPhone アプリでも使用されているため、API を変更することはできません。だから私はこれを回避する必要があります。

XStream を使用して API から XML を読み込もうとしています。すべてが順調に進んでおり、XStream は問題なく簡単に動作しています。あいまいなタグを使用した API 呼び出しに出くわすまでは。API によって返された XML は次のとおりです。

<response>
    <plant>
        <Name />
        <Description />
        <KeyValues>
            <entry>
                <Key />
                <Value />
            </entry>
            <entry>
                <Key />
                <Value />
            </entry>
            <entry>
                <Key />
                <Value />
            </entry>
        </KeyValues>
        <Tasks>
            <entry>
                <Title />
                <Text />
            </entry>
            <entry>
                <Title />
                <Text />
            </entry>
        </Tasks>
    </plant>
</response>

ご覧のとおり、KeyValues タグと Tasks タグの両方にエントリ タグが含まれています。私が抱えている問題は、エントリタグを私が持っているJavaクラスに具体的にエイリアスできないことです。私のプラントクラスは次のようになっています:

public class Plant extends BaseModel {
    private String Name;
    private String Description;

    private List<KeyValue> KeyValues;
    private List<Task> Tasks;
}

KeyValue クラスと Task クラスは、基本的に 2 つのエントリ クラスです。しかし、xml を逆シリアル化しようとすると、次のエラーが発生します。

com.thoughtworks.xstream.converters.ConversionException: Cannot construct java.util.Map$Entry as it does not have a no-args constructor : Cannot construct java.util.Map$Entry as it does not have a no-args constructor
---- Debugging information ----
message             : Cannot construct java.util.Map$Entry as it does not have a no-args constructor
cause-exception     : com.thoughtworks.xstream.converters.reflection.ObjectAccessException
cause-message       : Cannot construct java.util.Map$Entry as it does not have a no-args constructor
class               : java.util.Map$Entry
required-type       : java.util.Map$Entry
converter-type      : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
ath                : /response/plant/KeyValues/entry
line number         : 1
class[1]            : java.util.ArrayList
converter-type[1]   : com.thoughtworks.xstream.converters.collections.CollectionConverter
class[2]            : com.example.android.stadseboeren.model.Plant
version             : 0.0
-------------------------------

xml であいまいなタグを使用することは理想的な状況ではありませんが、現在それを変更するためにできることは何もありません。

この問題を解決するのを手伝ってくれる人はいますか?

乾杯大安

4

1 に答える 1

2

OK、良き市民になるために、私はそれを理解したので、ここに答えを投稿します.

最終的に、本質的にエントリリストの単なるホルダーである追加のクラスを作成することになりました。

public class KeyValues extends BaseModel {

    @XStreamImplicit(itemFieldName="entry")
    private ArrayList<KeyValueEntry> entries;
}

XStreamImplicit を使用して、エントリ オブジェクトを配列リストにバインドできます。

それは最もきれいな解決策ではありませんが、うまくいきます。

于 2013-04-12T14:43:08.003 に答える