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

时间:2015-06-14 18:39:00

标签: java json gson

我遇到一种特殊情况,即我正在检索具有唯一ID作为其键的对象列表,并且它们还具有嵌套对象,这些对象也具有自己的唯一ID。

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

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

enter image description here

我希望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 OUTPUT

"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
  }
},
}

1 个答案:

答案 0 :(得分:1)

由于名称不同,您既不能使用注释,也不能在Java类中使用具有相同名称的字段。

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

假设这里有适当的构造函数,你可以如何为Objects类实现一个反序列化器(顺便说一句,因为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 = 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);

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

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

输出:

NestedObject2

你需要为std::tie类定义一个自定义反序列化器,在这里我只用一个空列表填充它,但我想你能够这样做,因为它的原理相同。

希望它有所帮助! : - )