【问题标题】:Mqtt message into Java Object将 Mqtt 消息转换为 Java 对象
【发布时间】:2021-12-27 12:04:48
【问题描述】:

我想在 spring mvc 应用程序中使用 mqtt 消息有效负载填充 Java pojo 类。我的代码是:

String messagePayload =  (String) message.getPayload();
ObjectMapper  objectMapper= new ObjectMapper();
Test test = null;
    try {
        test = objectMapper.readValue(messagePayload, Test.class);
    } catch (IOException e) {
        e.printStackTrace();
        return;
    } 

MQTT MessagePayload 是{"name":"abc","age": 32},但是当它在变量 messagePayload 中转换为字符串时,它显示为 {name:abc,age:32}。你看,去掉所有的双引号。这个当去 try 块时会抛出一个错误

com.fasterxml.jackson.core.JsonParseException: Unexpected character ('n' (code 110)): was expecting double-quote to start field name
 at [Source: (String)"{name:abc,age:34}"; line: 1, column: 3]

我需要帮助将 MQTT 消息转换为 Java POJO 类。还有另一种方法吗?或者如何更正我现有的代码?

【问题讨论】:

  • message 的 Object 类型是什么?
  • 你用的是什么库。
  • public uploadReading(Message> message){ codes are here} Message 是通用类型。我正在使用以下库: 1. Spring-Integration-mqtt-5.2.7 2.org.eclipse.paho.client.mqttv3-1.2.2\org.eclipse.paho.client.mqttv3-1.2.2
  • 还添加import ... 部分。

标签: java spring spring-mvc mqtt message


【解决方案1】:

MqttMessage.getPayload() 返回一个字节[]。要将其转换为 String 对象,您应该使用 new String(message.getPayload())

【讨论】:

  • 我使用的是 Message> 对象,而不是 MqttMessage 对象。因此,message.getPayoad() 可以被类型转换为字符串,例如 (String)message.getPayoad()。
【解决方案2】:

我解决了这个问题。实际上,我是从 cmd 传递消息(mosquitto 安装在我的 Windows 中),例如 mosquitto_pub -t whatTopic -m "{"name":abc, "age":32}"。 在这条消息中,Spring mvc 应用程序如
{name:abc,age:32} 中出现。因此,它无法使用 Jackson 或 Gson 库反序列化为对象。
但是,当我使用工具 MQTTLens 发送相同的消息时,消息完全像 {"name":abc, "age":32} 现在,可以将其反序列化为 java 对象。 所以,我现在假设应该从命令提示符只发送字符串。如果想测试一个像消息这样的 JSON 格式的应用程序,可以使用 MQTTLens 之类的工具进行测试。

【讨论】:

  • 您必须转义内部的双引号,例如 "{\"name\":abc, \"age\":32}"。否则它们会被 cmd 解释/吃掉。
猜你喜欢
  • 2017-07-11
  • 1970-01-01
  • 2019-05-01
  • 2014-09-10
  • 2015-11-26
  • 2012-11-11
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
相关资源
最近更新 更多