1

我正在开发一个 Android 项目,该项目使用 API 来获取它的数据。现在首先,我不能对 API 进行任何更改,因为它也用于已经发布的 iPhone 应用程序中。所以我必须解决这个问题。

我正在尝试使用 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 类本质上是两个入口类。但是当我尝试反序列化 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

好的,所以要成为一个好公民,我会在这里发布答案,因为我想通了。

最终我最终创建了一个额外的类,它本质上只是条目列表的持有者。

public class KeyValues extends BaseModel {

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

使用 XStreamImplicit 我可以将条目对象绑定到我的数组列表。

这不是最漂亮的解决方案,但它有效。

于 2013-04-12T14:43:08.003 回答