Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用gson解析JSON数组中的多个类型_Java_Json_Gson - Fatal编程技术网

Java 使用gson解析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

我试图使用带有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:\"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中使用),我想学习如何使用泛型