Java 使用gson解析JSON数组中的多个类型
我试图使用带有gson的POJO解析JSON字符串,但在尝试读取以下JSON数组时遇到了障碍:Java 使用gson解析JSON数组中的多个类型,java,json,gson,Java,Json,Gson,我试图使用带有gson的POJO解析JSON字符串,但在尝试读取以下JSON数组时遇到了障碍: {"translate":"chat.type.text","with":[{"insertion":"woder22","clickEvent":{"action":"suggest_command","value":"/msg woder22 "},"hoverEvent":{"action":"show_entity","value":"{name:\"woder22\",id:\"bbd02c
{"translate":"chat.type.text","with":[{"insertion":"woder22","clickEvent":{"action":"suggest_command","value":"/msg woder22 "},"hoverEvent":{"action":"show_entity","value":"{name:\"woder22\",id:\"bbd02ce0-24de-4683-8c8f-5d7e6b7dffa6\",}"},"text":"woder22"},"hi"]}
在我进入“with”部分之前,一切都很正常,我正在尝试使用以下POJO解析它
public class ChatMessage {
private String text = "";
private String translate;
private List<With> with = new ArrayList<With>();
private String score;
private String selector;
private List<Node> extra;
private String bold = "false";
private String italic = "false";
private String underlined = "false";
private String strikethrough = "false";
private String obfuscated = "false";
private String color;
private Clicked clickEvent;
private Hover hoverEvent;
private String insertion;
//getter and setter method here
}
class Node {
private String color;
private String text;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
class Clicked {
private String action;
private String value;
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
class Hover {
private String action;
private String value;
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
现在的问题是,当Gson试图解析它时,它当然会遇到“with”数组的第二部分不是with对象的问题。我的问题是,我不知道如何处理这个问题。任何帮助都将不胜感激
编辑1
它应该做什么:
with数组被简单地假设为一种“覆盖”,因为主字符串中的任何字段都可以被覆盖,并在其中单独格式化。这就是With类底部的null应该做的事情,它应该编辑主要变量及其覆盖的内容。此处假定未命名字段为文本变量。以下是如何为此编写自定义反序列化程序:
class ChatMessageDezerializer implements JsonDeserializer<ChatMessage> {
@Override
public ChatMessage deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
ChatMessage message = new ChatMessage();
JsonObject obj = json.getAsJsonObject();
message.translate = obj.get("translate").getAsString();
JsonArray array = obj.getAsJsonArray("with");
message.with.add(context.deserialize(array.get(0), With.class));
message.with.add(array.get(1).getAsString());
return message;
}
}
请注意,with
现在是一个列表
,因为数组中元素最具体的公共类型是Object。另外,我只做了有问题的部分,其余部分可以轻松处理。运行这个程序,你最终会
[With@b1a58a3, hi]
作为结果列表。这假设您对返回的结构拥有最低限度的控制权(或者至少您知道它将采用哪种格式)。它应该为您提供一个良好的起点。以下是如何为此编写自定义反序列化程序:
class ChatMessageDezerializer implements JsonDeserializer<ChatMessage> {
@Override
public ChatMessage deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
ChatMessage message = new ChatMessage();
JsonObject obj = json.getAsJsonObject();
message.translate = obj.get("translate").getAsString();
JsonArray array = obj.getAsJsonArray("with");
message.with.add(context.deserialize(array.get(0), With.class));
message.with.add(array.get(1).getAsString());
return message;
}
}
请注意,with
现在是一个列表
,因为数组中元素最具体的公共类型是Object。另外,我只做了有问题的部分,其余部分可以轻松处理。运行这个程序,你最终会
[With@b1a58a3, hi]
作为结果列表。这假设您对返回的结构拥有最低限度的控制权(或者至少您知道它将采用哪种格式)。它应该为您提供一个良好的起点。您希望如何使用此“hi”值?是否将其存储在列表中?丢弃它?哦,是的-我试图把它放在一个变量中,在这个例子中是“text”变量(它是实际的文本,而这里的其余部分是格式),如果它有帮助的话,这里是关于这里使用的实际json字符串的文档:您链接的文档没有显示这个特定的结构(谈到with数组)。无论如何,你可以编写一个自定义的反序列化程序来解析这个JSON,你有没有可能让我这样做呢?我对Gson比较陌生。当然,但我不太确定您需要哪种最终结构,所以如果您能澄清一些有帮助的事情。您希望如何处理这个“hi”值?是否将其存储在列表中?丢弃它?哦,是的-我试图把它放在一个变量中,在这个例子中是“text”变量(它是实际的文本,而这里的其余部分是格式),如果它有帮助的话,这里是关于这里使用的实际json字符串的文档:您链接的文档没有显示这个特定的结构(谈到with数组)。无论如何,你可以编写一个自定义的反序列化程序来解析这个JSON,你有没有可能让我这样做呢?我对Gson比较陌生。当然,但我不太确定您需要哪种最终结构,所以如果您能澄清一些有帮助的事情。@Alexis,您能告诉我一些关于泛型类型的事情吗?您在代码中实现的方式,我对它们知之甚少(比如如何在ArrayList中使用),我想学习如何使用它们generics@Alexis,你能告诉我一些关于泛型类型的事情吗?按照你在代码中实现的方式,我对它们知之甚少(比如如何在ArrayList中使用),我想学习如何使用泛型