11

也就是说,你可以发送

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

还是 GCM 请求的“数据”成员仅限于一级键值对?我问 b/c 谷歌文档 [1] 中的措辞提出了限制,其中说“数据”是:

一个 JSON 对象,其字段表示消息有效负载数据的键值对。如果存在,有效负载数据将作为应用程序数据包含在 Intent 中,键是额外的名称。例如,"data":{"score":"3x1"} 会产生一个额外命名为 score 的意图,其值为字符串 3x1 键/值对的数量没有限制,尽管消息的总大小。选修的。

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

4

3 回答 3

7

刚刚自己做了一个测试,证实了我的猜想。

使用此有效负载向自己发送 GCM:

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

我的客户收到了它并额外解析了“消息”意图,如下所示:

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

因此,您确实可以对数据键的值进行进一步的 JSON 解析。

于 2012-07-11T03:49:37.447 回答
2

尽管它似乎有效(请参阅其他答案和评论),但如果没有 Google 的明确声明,我不建议依赖它,因为他们的文档始终将 json 的顶级成员称为“键值对”。他们提供的服务器端助手 jar [1] 也强化了这个想法,因为它将用户数据建模为Map<String, String>. 他们的Message.Builder.addData方法甚至不支持非字符串值,所以即使布尔值、数字和 null 可以在 json 中表示,我也会谨慎使用它们。

如果 Google 以破坏这种(可以说不受支持的)用法的方式更新其后端代码,则依赖它的应用程序将需要更新才能继续工作。为了安全起见,我将使用单个键值对,其值为 json 字符串化的深度对象 [2]。我的数据不是很大,我可以承受 json-inside-json 开销,但是 ymmv。此外,我的成员之一是一个可变长度列表,将它们展平为键值对总是很难看的 :)

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

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

{
  "registration_ids": ["whatever", ...],
  "data": {
    "player": "{\"score\": 1234, \"new_achievements\": [\"hot foot\", \"nimble\"]}"
  }
}
于 2012-07-28T22:28:37.227 回答
0

如果我错了,请原谅我,Map<String, String>表示 key=string 和 value=string。

如果字符串是一个长的不合理的 json 提取,它是 UTF-8 格式并且很好地转义。按理说应该调用 new JSONObject(receivedString); 它可以工作,然后所有其他 json 调用都会跟随。

不要忘记原始 JSON 是一个字符串!我们不需要谷歌来澄清如何使用字符串..这就是您的测试有效的原因!

于 2013-05-13T11:06:40.980 回答