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