json - GSON解析同名下具有不同类型数据的JSON

标签 json deserialization gson

您好,我有以下 json 数据

{
  "actionslist": [
    {
      "type": "SET_TP_DST",
      "port": 135
    },
    {
      "type": "OUTPUT",
      "port": {
        "node": {
          "id": "00:00:00:00:00:00:00:03",
          "type": "OF"
        },
        "id": "2",
        "type": "OF"
      }
    }
  ]
}

我想使用gson.fromJson反序列化这个json。但这里的问题是port有时保存一个数字,有时保存一个对象。如何获取端口来获取对象和数字?

最佳答案

public class PortConverter implements JsonDeserializer<Port> {
    public Port deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext ctx) {
        Port port = null;
        if (json.isJsonPrimitive()) {
            // handle your first case:
            port = new Port(json.getAsInt());
            // in this case you will have a Port object with populated id
        } else if (json.isJsonObject()) {
            // manually parse your Port object
            port = new Port();
            port.setNode(ctx.deserialize(json.getAsJsonObject().get("node"), Node.class));
            port.setId(json.getAsJsonObject().get("id").getAsInt());
            port.setType(json.getAsJsonObject().get("type").getAsString());
        }
        return port;
    }
}

POJO 类:

class Port {
    int id;
    String type;
    Node node;

    Port() { }

    Port(int id) { this.id = id; }

    /* setters */

    class Node {
        String id;
        String type;
    }
}

class Action {
    String type;
    Port port;
}

注册您的解串器:

gsonBuilder.registerTypeAdapter(Port.class, new PortConverter());

关于json - GSON解析同名下具有不同类型数据的JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24039438/

相关文章:

json - 将 JSON 数据传递给 Spring MVC Controller

javascript - Ajax 成功需要一些 php JSON 对象

c# - 如何将消息反序列化为强类型对象,然后为该消息动态调用运行时分配的处理程序

java - 如何将json字符串转换为java对象

java - JSON对所有对象都有唯一的键,如何使用GSON转换为POJO?

sql-server - OPENJSON 扩展了其他列

java - 覆盖java序列化不匹配

java - 使用 gson 和 back 进行序列化不适用于泛型类型

java - 如何正确处理重要的未检查异常

javascript - 如何强制 $.getJSON 在 Javascript 中的 $http 之前运行?