使用Android GCM,您可以使用深层的JSON“数据”字段吗?

也就是说,你可以发送

{ "registration_ids": ["whatever", ...], "data": { "foo": { "bar": { "baz": [42] } } } } 

或者是GCM请求的“数据”成员是否仅限于一个键值对的级别? 我问b / c,这个限制是由Google的文档[1]中的措辞提出的,其中“数据”是:

一个JSON对象,其字段表示消息的有效内容数据的键值对。 如果存在,有效载荷数据将作为应用程序数据包含在意图中,其中关键字是附加的名称。 例如,“data”:{“score”:“3×1”}会导致一个额外的命名分数,其值是string3x1。键/值对的数量没有限制,尽pipe对消息的总大小。 可选的。

[1] http://developer.android.com/guide/google/gcm/gcm.html#request

Solutions Collecting From Web of "使用Android GCM,您可以使用深层的JSON“数据”字段吗?"

只是做了一个testing自己,并证实了我的猜想。

用这个有效载荷发送一个GCM给自己:

 { "registration_ids": ["whatever", ...], "data": { "message": { "bar": { "baz": [42] } } } } 

我的客户收到了这个消息,然后parsing这个消息:

 handleMessage - message={ "bar": { "baz": [42] } } 

所以你确实可以对数据键的值做更多的JSONparsing。

虽然它似乎能够工作(请参阅其他答案和评论),但如果Google没有明确的声明,我不build议依赖它,因为它们的文档一直将json的顶级成员称为“键 – 值对”。 他们提供的服务器端助手jar也强化了这个想法,因为它将用户数据build模为Map<String, String> 。 他们的Message.Builder.addData方法甚至不支持非string值,所以尽pipe布尔值,数字和null在json中都是可表示的,但我也会谨慎使用这些值。

如果Google以破坏这种(可以说是不受支持的)用法的方式更新其后端代码,那么依赖它的应用程序将需要更新才能继续工作。 为了安全起见,我将使用一个键值对,其值是一个jsonstring的深对象[2]。 我的数据不是很大,我可以负担json-json-json的开销,但是ymmv。 另外,我的一个成员是一个可变长度的列表,并将它们压缩到键值对总是很难看:)

[1] http://developer.android.com/guide/google/gcm/server-javadoc/index.html(jar本身只能在gcm-server / dist目录下的Android SDK中使用,根据http: //developer.android.com/guide/google/gcm/gs.html#server-app )

[2]例如,我的整个有效载荷将如下所示:

 { "registration_ids": ["whatever", ...], "data": { "player": "{\"score\": 1234, \"new_achievements\": [\"hot foot\", \"nimble\"]}" } } 

如果我错了,请打个比方, Map<String, String>表示key = string,value = string。

如果string是一个很长的不合理的JSON提取是UTF-8格式化,并很好地逃脱。 原因是你应该调用新的JSONObject(receivedString); 它的工作原理是所有其他的JSON调用。

不要忘记,原始的JSON是一个string! 我们不需要谷歌澄清如何使用string..这就是为什么你的testing工作!