GAE服务器和Android客户端上的数据类型

3
我正在使用Java GAE服务器。我在实体上存储List(因为在GAE中字符串长度非常有限)。我通过Endpoint向客户端发送Map,并将此列表放在某个键下。然后我在Android客户端检索此列表 - 结果我遇到了类转换异常。似乎从GAE服务器发送的HashMap< String, Object > 在客户端被视为JsonMap。不管怎样。我继续,检索我的List…多么惊讶地发现,在客户端上,我得到了List< ArrayMap >,并且在这个ArrayMap中,我的Text位于名为“value”的键下。
还有更多。在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 使用量)……我认为这样做可以更可预测和开箱即用。

请发布将实体转换为JSON的服务器端代码以及解析JSON的客户端代码。还请包含任何异常的完整堆栈跟踪。 - Philipp Reichart
1个回答

1
在这个例子中,该方法将返回一个Map<< String, Object>>实例。如果您尝试使用https://your_app_id.appspot.com/_ah/api/explorer调用此端点,则json返回值将为{ "myList" : { { "value": "something"} }, "myNull" : null }。
返回的json似乎是正确的,并且针对“myNull”返回了null。之所以返回Object的实例而不是null,是因为JSON库处理JSON null的方式。请查看此link以获取更多解释(JSON null部分)。
至于为什么List<< Text>>会神奇地转换为List<< ArrayMap>>,这是因为您将返回定义为Map<< String, Object>>实例,并且返回的json不包含任何类型信息。我认为,在转换为客户端对象时,类型信息是从基于ApiMethod签名生成的客户端代码中获取的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接