Java 如何使用GSON反序列化作为单个对象或对象列表传递的字段?

Java 如何使用GSON反序列化作为单个对象或对象列表传递的字段?,java,gson,Java,Gson,我已经成功地使用GSON将JSON转换为单个对象,并将JSON转换为对象列表。我的问题是有两个源向我发送数据。一个只发送一个对象,另一个发送对象列表 单个对象来自第一个来源: { id : '1', title: 'sample title', .... } 第二来源的对象列表: [ { id : '1', title: 'sample title', .... }, { id :

我已经成功地使用GSON将JSON转换为单个对象,并将JSON转换为对象列表。我的问题是有两个源向我发送数据。一个只发送一个对象,另一个发送对象列表

单个对象来自第一个来源:

{
    id : '1',
    title: 'sample title',
    ....
}
第二来源的对象列表

[
    {
        id : '1',
        title: 'sample title',
        ....
    },
    {
        id : '2',
        title: 'sample title',
        ....
    },
    ...
]
用于反序列化的类

 public class Post {

      private String id;
      private String title;

      /* getters & setters */
 }
下面是我的第一个案例:

Post postData = gson.fromJson(jsonObj.toString(), Post.class);
这是我的第二个案例:

Post[] postDatas = gson.fromJson(jsonObj.toString(), Post[].class);
有没有办法处理这两种情况?或者我应该查看字符串并在不可用时添加[]
谢谢

您可以使两个源以相似的结构向您发送数据。例如,它们都发送对象列表。如果要发送一个对象,则需要更新该对象以向您发送一个对象列表,这样您就可以管理这两种情况。

如何创建一个自定义反序列化程序来检查json是否为数组,如果不是,则创建一个包含单个对象的数组,如:

public class PostArrayOrSingleDeserializer implements JsonDeserializer<Post[]> {

    private static final Gson gson = new Gson();

    public Post[] deserialize(JsonElement json, Type typeOfT, 
                JsonDeserializationContext ctx) {
        try {
            return gson.fromJson(json.getAsJsonArray(), typeOfT);
        } catch (Exception e) {
            return new Post[] { gson.fromJson(json, Post.class) };
        }
    }
}

因此,您应该始终拥有一个包含一个或多个项目的
Post
数组。

您好,感谢您抽出时间回复。这是不可能的。这就是我寻求帮助的原因。
Post[] postDatas = new GsonBuilder().setPrettyPrinting()
    .registerTypeAdapter(Post[].class, new PostArrayOrSingleDeserializer())
    .create()
    .fromJson(jsonObj.toString(), Post[].class);