如何从IPFS PubSub订阅结果列表提取值并赋值给本地变量
提取IPFS PubSub消息字段到本地变量的方法
我来帮你梳理下怎么从这些PubSub消息里提取字段到本地变量。首先看你的结果里每个Map包含from、data、seqno和topicIDs这几个键,我们可以逐个遍历列表里的元素,通过键取值并做类型转换,下面是修改后的完整代码和细节说明:
import java.util.Base64; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; // 假设ipfs实例已正确初始化 public void pubsub() throws Exception { String topic = "demo" + System.nanoTime(); Stream<Map<String, Object>> sub = ipfs.pubsub.sub(topic); String data = "Hello!"; Object pub = ipfs.pubsub.pub(topic, data); Object pub2 = ipfs.pubsub.pub(topic, "G'day"); List<Map<String, Object>> results = sub.limit(2).collect(Collectors.toList()); // 遍历每个消息,提取字段到本地变量 for (Map<String, Object> message : results) { // 保留原有的data字段过滤逻辑 if (message.containsKey("data")) { // 提取各个字段,注意做类型转换(因为Map的值是Object类型) String from = (String) message.get("from"); String encodedData = (String) message.get("data"); String seqno = (String) message.get("seqno"); List<String> topicIDs = (List<String>) message.get("topicIDs"); // 可选:解码Base64格式的data内容(原输出里的data是编码后的字符串) String decodedData = new String(Base64.getDecoder().decode(encodedData)); // 这里可以用这些变量做后续业务处理,比如打印验证 System.out.println("消息来源: " + from); System.out.println("原始编码数据: " + encodedData); System.out.println("解码后内容: " + decodedData); System.out.println("消息序列号: " + seqno); System.out.println("所属主题: " + topicIDs); System.out.println("---"); } } }
关键细节说明
- 类型转换:因为你的
Map值是Object类型,必须转换为实际对应的类型(比如String、List<String>),要确保类型匹配,避免抛出ClassCastException。 - Base64解码:IPFS PubSub的
data字段默认是Base64编码的,比如SGVsbG8h对应Hello!,如果需要原始文本内容,一定要用Base64.getDecoder()解码。 - 遍历方式:这里用增强for循环更直观,方便在循环内定义和使用本地变量;如果你偏好流式写法,也可以这样写:
results.stream() .filter(message -> message.containsKey("data")) .forEach(message -> { String from = (String) message.get("from"); String encodedData = (String) message.get("data"); // 其他字段提取和处理逻辑... });
预期输出示例
运行修改后的代码,会得到类似这样的输出:
消息来源: EiANvs2UUz/KwtJhTJIgOdUPvsNeVF74GczENrlC4UCFVQ== 原始编码数据: SGVsbG8h 解码后内容: Hello! 消息序列号: FaaJ6v+WW+g= 所属主题: [demo134001007467618] --- 消息来源: EiANvs2UUz/KwtJhTJIgOdUPvsNeVF74GczENrlC4UCFVQ== 原始编码数据: RydkYXk= 解码后内容: G'day 消息序列号: FaaJ6v+WW+k= 所属主题: [demo134001007467618] ---
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

