使用 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

smack 使用 4.1.0 rc1 在 muc 中接收消息

如何使用 smack 和 java 从 jid 到 jid?