gson空反序列化

uubf1zoe  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(435)

我正在尝试制作一个需要使用json的java程序,我选择gson作为我的库来处理json的管理
但是,当我尝试反序列化我的json时,messagereturn.text值和extra.text值都被设置为null,我已经尝试解决这个问题,但是我无法解决。
我试图反序列化的json的一个例子是

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

我就是这么叫格森的

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

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

下面是我试图反序列化的类
消息返回.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();
    }
}

额外.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;
    }

}
ibrsph3r

ibrsph3r1#

第一个错误: String.valueOf(…) 返回tostring方法的值。因为没有重写它,所以调用gson将对象引用解析为json—这是错误的。相反,类消息应该返回负载本身。这可能是一个字节数组或已经是一个字符串。后者更好,这样您就不会遇到字符集问题。也许应该是这样的:

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
}

相关问题