С Android GCM вы можете использовать глубокое поле данных JSON?

То есть вы можете отправить

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

или является членом "данных" запроса GCM, ограниченным одним уровнем пар ключ-значение? Я прошу b/c, что ограничение предлагается в формулировке в документе doc [1], где говорится, что "данные":

Объект JSON, поля которого представляют пары ключ-значение данных полезной нагрузки сообщения. Если они имеются, данные полезной нагрузки будут включены в намерение в качестве данных приложения, причем ключ является дополнительным именем. Например, "данные": { "оценка": "3x1" } приведет к дополнительному именованному счету намерения, значение которого представляет собой строку 3x1. Количество пар ключей/значений не ограничено, хотя существует ограничение на общий размер сообщения. Необязательно.

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

Ответ 1

Просто сделал тест сам и подтвердил мою гипотезу.

Отправьте GCM себе с этой полезной нагрузкой:

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

И мой клиент получил его и проанализировал намерение "сообщение" как это:

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

Итак, вы действительно можете продолжить JSON, анализируя значение ключа данных.

Ответ 2

Хотя он работает (см. другие ответы и комментарии), без явного заявления от Google, я бы не стал рекомендовать полагаться на него, так как их документация последовательно ссылается на членов верхнего уровня json как "пары ключ-значение" ". Вспомогательные банки на стороне сервера, которые они предоставляют [1], также усиливают эту идею, поскольку она моделирует пользовательские данные как Map<String, String>. Их метод Message.Builder.addData даже не поддерживает нестроковые значения, поэтому даже если логические значения, числа и нуль представляются в json, я также буду осторожен с ними.

Если Google обновляет свой внутренний код способом, который нарушает это (возможно, неподдерживаемое) использование, приложения, которые полагаются на него, нуждаются в обновлении для продолжения работы. Чтобы быть в безопасности, я собираюсь использовать одну пару "ключ-значение", значение которой представляет собой сильно сжатый объект json [2]. Мои данные не очень большие, и я могу позволить себе json-in-json overhead, но ymmv. Кроме того, один из моих членов представляет собой список переменной длины, и сглаживание этих значений для пар ключ-значение всегда уродливо:)

[1] http://developer.android.com/guide/google/gcm/server-javadoc/index.html (Сама банка доступна только из SDK Android в каталоге 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\"]}"
  }
}

Ответ 3

Оцените меня, если я ошибаюсь, Map<String, String> обозначает key = string и value = string.

Если строка - это длинный необоснованный json-экстракт, который является UTF-8 отформатированным и хорошо экранированным. Разумеется, следует назвать новый JSONObject (полученнойString); и он работает, тогда следуют все другие вызовы json.

Не забывайте, что raw JSON - это строка! Мы не нуждаемся в Google, чтобы разъяснить, как работать со строками. Именно поэтому ваш тест сработает!