使用 Smack 库访问 Message Stanza 中的 JSON 对象
Posted
技术标签:
【中文标题】使用 Smack 库访问 Message Stanza 中的 JSON 对象【英文标题】:Accessing JSON object inside Message Stanza using Smack Library 【发布时间】:2016-08-03 23:42:18 【问题描述】:当从 Firebase 云消息传递服务收到确认消息时,我的 addAsyncStanzaListner 被调用。我需要根据文档确认此消息。我遇到的问题是我无法到达接收到的消息节中到达的 JSON 对象内的“message_type”“key”/“value”对。你能帮我访问这个重要的价值/对吗?我正在使用 Smack 库 4.1。我一直在关注这个设置的帖子答案,但不知何故它不起作用: GCM XMPP Server using 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
【问题讨论】:
由于您使用的是 smack 库,请看一下这个使用 smack 4.1 的示例。 github.com/googlesamples/friendlyping/blob/master/server/Java/… 【参考方案1】:在您的代码中,您只需将 Stanza 作为 Java 对象接收。
Stanza 有一个输出 XML 的方法。
如果需要,可以使用此方法获取 JSON,只需添加一些自定义功能即可。
Following this example
您的代码可能如下所示:
@Override
public void processPacket(Stanza packet) throws SmackException.NotConnectedException
JSONObject jsonObj = XML.toJSONObject(packet.toXML());
String json = jsonObj.toString();
//foo
【讨论】:
【参考方案2】:注意:此答案适用于从消息中提取 JSON 的一般问题。在 FCM 的情况下,可能还有另一种更合适的方法。
假设您有一个对应于以下 XML 的 Stanza
对象:
<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();
【讨论】:
以上是关于使用 Smack 库访问 Message Stanza 中的 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Smack 中设置自定义 Message.Type 字符串?
基于openfire+smack即时通讯instant message开发
Smack Message.setType() 不起作用,类型设置为“聊天”
在 smack XMPP android 中发送 Message.Type.normal