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

JSON has unique keys for all objects, how to convert to POJO using GSON?

我有一个特殊的情况,我正在检索一个对象列表,这些对象有唯一的 ID 作为它们的键,它们也有嵌套的对象,它们也有自己唯一的 ID。

我正在使用 GSON 创建 pojo,但是在为这些对象创建模型 类 时,我需要序列化所有唯一键值,这不是一个好的解决方案。

我附上了一张图片,让您更好地了解我在说什么:

我希望 GSON 创建一个 NestedObject1 的列表,它本身将包含一个 NestedObject2 的列表。问题是每种 NestedObject

的键值都是唯一的

我正在考虑这样做:

Objects.java

public class Objects {

    @SerializedName("Objects")
    private List<NestedObject1> mNestedObjects1;
    public List<NestedObject1> getNestedObjects1() {
        return mNestedObjects1;
    }

}

NestedObjects1.java

public class NestedObject1 {

    @SerializedName("WHAT-TO-PUT-HERE?")
    private String mId;
    public String getId() {
        return mId;
    }

    @SerializedName("WHAT-TO-PUT-HERE?")
    private List<NestedObject2> mNestedObjects2;
    public List<NestedObject2> getNestedObjects2() {
        return mNestedObjects2;
    }

}

NestedObject2

public class NestedObject2 {

    // Same deal here?

}

关于如何解决这个问题有什么建议吗?

编辑:样本JSON输出

"Objects" : {
"-JrEvneZHQV73jxKu0-U" : {
  "-JrEvoBeZaysRRttNGP-" : {
    "started" : true
  },
  "-JrEvqaNyTHhjRIMGR-r" : {
    "started" : true
  }
},
"-JrF0_yWy_NmrMROB3qp" : {
  "-JrF0lWRsa5KmU6SnC7Z" : {
    "started" : true
  },
  "-JrF1txLoFd2w4wN8Q4n" : {
    "started" : true
  },
  "-JrF2skHdMmT9WN3wKVS" : {
    "started" : true
  }
},
"-JrF3XSkpvo2WMzF1osb" : {
  "-JrF3ZYwyxUz0RDooVna" : {
    "started" : true
  },
  "-JrF4D-cesLhqbbzdfT1" : {
    "started" : true
  },
  "-JrF5GufdDqFGjw8aYRB" : {
    "started" : true
  }
},
}

由于名称不同,您不能在 Java class.

中使用注释或具有相同名称的字段

我的建议是实现自定义反序列化器,这样您就不必关心这些键值。

假设有合适的构造函数,这里是如何为 Objects class 实现反序列化器(顺便说一句,这是一个非常糟糕的名字,因为已经有一个名为 [=13] 的 class =] 在 JDK).

class ObjectsDeserializer implements JsonDeserializer<Objects> {
    @Override
    public Objects deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject().getAsJsonObject("Objects");
        List<NestedObject1> list = new ArrayList<>();
        for(Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
            List<NestedObject2> nestedObject2List = new ArrayList<>();
            //here deserialize each NestedObject2 and put it in the list
            list.add(new NestedObject1(entry.getKey(), nestedObject2List));
        }
        return new Objects(list);
    }
}

然后在 Gson 解析器中注册反序列化器:

Gson gson = new GsonBuilder()
    .registerTypeAdapter(Objects.class, new ObjectsDeserializer())
    .registerTypeAdapter(NestedObject2.class, new NestedObject2Deserializer())
    .create();

Objects o = gson.fromJson(new FileReader(new File("file.json")), Objects.class);

输出:

Objects{mNestedObjects1=
    NestedObject1{mId='-JrEvneZHQV73jxKu0-U', mNestedObjects2=[]}
    NestedObject1{mId='-JrF0_yWy_NmrMROB3qp', mNestedObjects2=[]}
    NestedObject1{mId='-JrF3XSkpvo2WMzF1osb', mNestedObjects2=[]}
}

您需要为 NestedObject2 class 定义一个自定义反序列化器,这里我只是用一个空列表填充它,但我想您可以这样做,因为它是同样的原理。

希望对您有所帮助! :-)