我正在使用java GAE服务器。我将List存储在我的实体上(因为字符串在GAE中的长度非常有限)。我通过端点将Map发送到客户端,并将此列表放在某个键下。然后我在Android客户端上检索此列表 - 我得到了classcast异常。看来HashMap<字符串,对象>从GAE服务器发送的客户端被视为JsonMap。随你。我继续,我检索我的列表...我有多惊讶我在客户端找到了我得到List< ArrayMap>,在这个ArrayMap上,我的Text位于名为“value”的键下。
还有更多。在JsonMap中的一个键下,我有一个空值。我检索它...它显示为Object(不为null)。在这个对象上调用toString给了我一些糟糕的字符串......
有谁能告诉我为什么会发生这些事情?当然,我可以接受它,但它的奇怪和不合逻辑,无证......为什么我的列表<文字>神奇地转换成List< ArrayMap>?它有多大可能会随着Android版本的变化而变化,或者,我不知道,在室外的天气变化?...任何人都可以帮我理解这些情况?或者给我一些相关的文档/文章?
服务器端示例:
@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(ok)。 myList.get(0)的类型为ArrayMap,其单元素ArrayMap - 此映射中的元素具有名为“value”的键,值为“something”。 “myNull”的类型为Object且不为null,其toString()方法显示类似[Ljava.lang.Object; @ 1db9742。
我通过返回空字符串而不是null来解决问题。对于列表&lt;文字&gt;,我遍历它并将所有文本作为字符串添加到新列表&lt;字符串&gt;,然后返回这个新列表(但它在服务器上花费了cpu使用量)......我认为它将更加可预测和开箱即用。
答案 0 :(得分:1)
在此特定示例中,该方法将返回Map&lt;&lt;字符串,对象&gt;&gt;。如果您尝试使用https://your_app_id.appspot.com/_ah/api/explorer调用此端点,则json将返回 {&#34; myList&#34; :{{&#34; value&#34;:&#34;某事&#34;}},&#34; myNull&#34; :null}。
返回的json似乎是正确的,并且为&#34; myNull&#34;返回了null。您获取Object的实例而不是null的原因是由于JSON库处理JSON null。请查看此link以获取更多说明(JSON null部分)。
为什么List&lt;&lt;文本&GT;&GT;神奇地转换成List&lt;&lt; ArrayMap&gt;&gt;,这是因为您将返回定义为Map&lt;&lt;的实例字符串,对象&gt;&gt;并且返回的json不包含任何类型信息。我认为在转换为客户端对象时,类型信息是从生成的客户端代码中获取的,该客户端代码基于ApiMethod的签名。