我正在使用Java GAE服务器。我在实体上存储List(因为在GAE中字符串长度非常有限)。我通过Endpoint向客户端发送Map,并将此列表放在某个键下。然后我在Android客户端检索此列表 - 结果我遇到了类转换异常。似乎从GAE服务器发送的HashMap< String, Object > 在客户端被视为JsonMap。不管怎样。我继续,检索我的List…多么惊讶地发现,在客户端上,我得到了List< ArrayMap >,并且在这个ArrayMap中,我的Text位于名为“value”的键下。
还有更多。在JsonMap的一个键下,我有一个空值。我检索它...它出现为对象(不为空)。调用此对象的toString会给我一些垃圾字符串...
有人能告诉我为什么会发生这些事情吗?当然,我可以接受它是这样的,但它很奇怪,不合逻辑,没有记录...为什么我的List< Text > 神奇地转换为List< ArrayMap >?它可能会因为安卓版本或室外天气等因素而变化吗?...有人可以帮助我理解这些情况吗?或者提供一些相关的文档/文章?
示例服务器端:
在客户端,"result" 的类型为 JsonMap。"myList" 的类型为 ArrayList(好的)。myList.get(0)的类型为 ArrayMap,它的单元素 ArrayMap 中的元素具有名为"value"的键和值为"something"。"myNull" 的类型为 Object 并且不为空,其 toString() 方法显示类似于 [Ljava.lang.Object;@1db9742 的内容。
我通过返回空字符串而非 null 来解决了这些问题。对于 List< Text >,我遍历它并将所有的 Text 作为字符串添加到新的 List< String > 中,然后返回这个新列表(但这会在服务器上增加 CPU 使用量)……我认为这样做可以更可预测和开箱即用。
还有更多。在JsonMap的一个键下,我有一个空值。我检索它...它出现为对象(不为空)。调用此对象的toString会给我一些垃圾字符串...
有人能告诉我为什么会发生这些事情吗?当然,我可以接受它是这样的,但它很奇怪,不合逻辑,没有记录...为什么我的List< Text > 神奇地转换为List< ArrayMap >?它可能会因为安卓版本或室外天气等因素而变化吗?...有人可以帮助我理解这些情况吗?或者提供一些相关的文档/文章?
示例服务器端:
@ApiMethod(name = "retrievePlayer")
public Map<String, Object> retrievePlayer(Map<String, Object> data, User user) throws Exception, OAuthRequestException, IOException {
Map<String, Object> result = new HashMap<String, Object>();
List<Text> list = new ArrayList<Text>();
list.add(new Text("something"));
result.put("myList", list);
result.put("myNull", null);
return result;
}
在客户端,"result" 的类型为 JsonMap。"myList" 的类型为 ArrayList(好的)。myList.get(0)的类型为 ArrayMap,它的单元素 ArrayMap 中的元素具有名为"value"的键和值为"something"。"myNull" 的类型为 Object 并且不为空,其 toString() 方法显示类似于 [Ljava.lang.Object;@1db9742 的内容。
我通过返回空字符串而非 null 来解决了这些问题。对于 List< Text >,我遍历它并将所有的 Text 作为字符串添加到新的 List< String > 中,然后返回这个新列表(但这会在服务器上增加 CPU 使用量)……我认为这样做可以更可预测和开箱即用。