Доступ к объекту JSON внутри Message Stanza с использованием библиотеки Smack
Мой addAsyncStanzaListner вызывается при получении подтверждающего сообщения от сервисов Firebase Cloud Messaging. Мне нужно подтвердить это сообщение в соответствии с документами. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу найти пару "message_type" "ключ"/"значение" внутри объекта JSON, который поступает в раздел сообщения, который получен. Не могли бы вы помочь мне в доступе к этой важной ценности / пара. Я использую Smack Library 4.1. Я следовал за этим постом ответом для этой установки, но почему-то это не работает: GCM XMPP Server с использованием Smack 4.1.0
Вот как выглядит код:
other_connection.addAsyncStanzaListener(new StanzaListener() {
@Override
public void processPacket(Stanza packet) throws SmackException.NotConnectedException {
//how should i convert this stanza into a message stanza
//I have tried Message message = (Message)packet; IT DOESNT WORK
//I have tried getting the extension with the GCM Namespace. It doesnt
//return a json string
2 ответа
Примечание. Этот ответ предназначен для общей проблемы извлечения JSON из сообщения. В случае FCM, возможно, есть другой метод, который более уместен.
Предположим, у вас есть Stanza
объект, соответствующий следующему XML:
<message from='a@example.com' to='b@example.com' type='normal'>
<json xmlns='urn:xmpp:json:0'>{ "key1" : "value1", "key2": "value2" }</json>
<body/>
</message>
Чтобы извлечь строку JSON, вам нужно сделать:
import org.jivesoftware.smackx.json.packet.JsonPacketExtension;
...
JsonPacketExtension jsonPacketExtension = JsonPacketExtension.from(stanza);
String contentJson = jsonPacketExtension.getJson();
В своем коде вы просто получаете Stanza как Java-объект.
У Stanza есть метод для вывода XML.
Вы можете использовать этот метод для получения JSON, если вам нужно, просто добавьте некоторые пользовательские функции.
ваш код может выглядеть так:
@Override
public void processPacket(Stanza packet) throws SmackException.NotConnectedException {
JSONObject jsonObj = XML.toJSONObject(packet.toXML());
String json = jsonObj.toString();
//foo