Gson 空反序列化

Gson null deserialization

我正在尝试制作一个需要与 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;
    }

}

第一个错误:String.valueOf(…) returns toString 方法的值。由于您没有覆盖它,因此调用 Gson 将对象引用解析为 JSON – 这是错误的。相反,class 消息应该 return 有效载荷本身。这可能是一个字节数组或已经是一个字符串。后者更好,因此您不会 运行 陷入字符集问题。也许它应该是这样的:

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
}