接收到的对象与模型不对应

gr8qqesn  于 2021-07-05  发布在  Java
关注(0)|答案(3)|浏览(317)

我有个问题,但我觉得很难表达出来。我从mqtt接收字节[]中的消息,将其转换为字符串,然后将结果发送给gson,gson创建一个 JenkinsMqttObject .

String messageToString = message.getPayload().toString();
JenkinsMqttObject monobjet = gson.fromJson(messageToString, JenkinsMqttObject.class);

在示例代码中, JenkinsMqttObject 非常简单。我遇到的问题如下:
mqtt向我发送一个对象,该对象可以是:
“{”value1“:20,”value2“:40}
但也可能是:
“{”value1“:20,”value2“:40,”value3“:60}
因此,根据具体情况,我会收到一个包含2或3个属性的对象。问题是我创建了如下java模型:
jenkinsmqttobject.class类

private String value1;
private String value2;
private String value3;
//getter & setters...

问题是,我在gson上说,接收的对象是jenkinsmqttobject类型的,但它并不总是正确的!
所以我完全不知道,如何在java中接收一个对象,这个对象可以对应于或者不对应于一个模型。
谢谢你的帮助!

e3bfsja2

e3bfsja21#

正如rld的回答所暗示的, Map 是一条路要走。
你可以用 TypeToken 但您也可以声明一个特定的类,以避免使用前面提到的方法,并使解析更加简单,因此可以直接将其解析到Map中:

public class JenkinsMqttObject extends HashMap<String, Object> {}

我也不认为如果你把 byte[].toString() 它将生成有效的json,但会构造一个新的json String 来自 byte[] 将工作:

JenkinsMqttObject monobjet = gson.fromJson(new String(message.getPayload()),
                                               JenkinsMqttObject.class);

那就是:

monobjet.get("value1");
anhgbhbe

anhgbhbe2#

如评论中所述 value3 在json中丢失, gson 将设置 value3nullJenkinsMqttObject 示例。从 gson 文件(重点):
此实现正确处理空值。
序列化时,输出中省略空字段。
反序列化时,json中缺少的条目会导致将对象中的相应字段设置为其默认值:对象类型为null,数值类型为零,布尔值为false。

bmvo0sr5

bmvo0sr53#

您应该为您的模型类使用map或hashmap。它应该类似于下面给出的类。

class JenkinsMqttObject{
    HashMap<String, String> values;
    //getters & setters
}

你必须修改主代码如下。

String messageToString = message.getPayload().toString();
HashMap<String,String> vmap = new Gson().fromJson(messageToString , new TypeToken<HashMap<String, String>>(){}.getType());
JenkinsMqttObject monobjet = new JenkinsMqttObject();
monobjet.setValues(vmap);

现在,如果您想访问任何值,可以按以下方式访问它。

monobjet.getValues().get("value1");

相关问题