С 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, чтобы разъяснить, как работать со строками. Именно поэтому ваш тест сработает!