【问题标题】:Gson null deserializationGson null 反序列化
【发布时间】:2020-11-14 06:50:21
【问题描述】:

我正在尝试制作一个需要使用 json 的 java 程序,我选择 gson 作为我的库来处理管理 JSON

但是当我尝试反序列化我的 json 时,messagereturn.text 值和 extra.text 值都设置为 null,我试图解决这个问题,但我无法解决。

我试图反序列化的 json 示例是

{
    "text":"",
    "extra":[{
        "text":"eee joined the game",
        "color":"yellow"
    }]
}

这就是我对 gson 的称呼

 Message messagepacket = event.<ServerChatPacket>getPacket().getMessage();
                    Messagereturn mr = new Gson().fromJson(String.valueOf(messagepacket), Messagereturn.class);

                    System.out.println(mr.returnmethod());

这也是我要反序列化的类

messagereturn.java

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

import java.util.List;

public class Messagereturn {

    @SerializedName("text")
    @Expose
    private String text;
    @SerializedName("extra")
    @Expose
    private List<Extra> extra = null;


    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public List<Extra> getExtra() {
        return extra;
    }

    public void setExtra(List<Extra> extra) {
        this.extra = extra;
    }

    public String returnmethod() {
        Extra extra = new Extra();
       return getText() + extra.getText();
    }
}

Extra.java

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Extra {

    @SerializedName("text")
    @Expose
    private String text;
    @SerializedName("color")
    @Expose
    private String color;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

}

【问题讨论】:

    标签: java json gson


    【解决方案1】:

    第一个错误:String.valueOf(…) 返回 toString 方法的值。由于您没有覆盖它,因此调用 Gson 将对象引用解析为 JSON——这是错误的。相反,Message 类应该返回有效负载本身。这可能是一个字节数组或已经是一个字符串。后者更好,因此您不会遇到字符集问题。也许它应该是这样的:

    Message messagepacket = event.<ServerChatPacket>getPacket().getMessage();
    // or if getPayload is byte[] wrap in new String(messagepacket.getPayload());
    Messagereturn mr = new Gson().fromJson(messagepacket.getPayload()), Messagereturn.class);
    

    第二个错误是我们的方法public String returnmethod()。该代码创建了一个 Extra 的新实例,其中所有属性都根据 Java 语言规范进行了初始化。在您的情况下:全部为空。

    我假设你的意思是:

    public String renderTextAndExtra() {
      if (extra==null || extra.isEmpty()) {
        return text;
      }
      return text+"; all extras="+extra.stream()  // treat all instances
        .map(extra->extra.getText()+";"+extra.getColor())  // turn into String
        .collect(Collectors.joining(",")); // join all Extra Strings by comma
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-12
      • 2016-01-30
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多