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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если Google обновляет свой внутренний код таким образом, что это нарушает (возможно, неподдерживаемое) использование, приложения, которые полагаются на него, нуждаются в обновлении для продолжения работы. Для того, чтобы быть в безопасности, я собираюсь использовать одну пару «ключ-значение», значение которой представляет собой глубокий объект json-stringified [2]. Мои данные не очень большие, и я могу позволить себе накладные расходы json-in-json, но 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\"]}" } } 

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

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

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