Android Gson在单个JSON对象中使用两种列表类型进行序列化

Android Gson在单个JSON对象中使用两种列表类型进行序列化,android,android-json,jsonserializer,gson,Android,Android Json,Jsonserializer,Gson,我有两种类型的列表可以使用Gson库绑定请求。我试过一种方法,但效果很好。但我想知道我们是否有任何默认过程来序列化列表 我试着在下面工作。但这不是实施的方式。寻找更好的解决方案 class Request{ @Expose @SerializedName("ListC") private List<TypeOne> mList; public Request(List<TypeOne> listOne, List<TypeTwo&g

我有两种类型的列表可以使用Gson库绑定请求。我试过一种方法,但效果很好。但我想知道我们是否有任何默认过程来序列化列表

我试着在下面工作。但这不是实施的方式。寻找更好的解决方案

class Request{
    @Expose
    @SerializedName("ListC")
    private List<TypeOne> mList;

    public Request(List<TypeOne> listOne, List<TypeTwo> listTwo){
        this.mList = new ArrayList<>();
        for (int i = 0; i < listTwo.size(); i++) {
           // Adding the Typetwo values in TypeOne model class - Not best approach
           listOne.get(i).setAmount(listTwo.get(i).getAmount());
           listOne.get(i).setName(listTwo.get(i).getName());
           listOne.get(i).setType(listTwo.get(i).getType());
        }
        this.mList.addAll(listOne);
    }

    public String getJsonString(){
         Gson gson = new GsonBuilder()
            .registerTypeAdapter(TypeOne.class, new Serializer())
            .registerTypeAdapter(Date.class, new DateSerializer())
            .excludeFieldsWithoutExposeAnnotation()
            .create();

    JsonObject in = new JsonObject();
    in.add("in", gson.toJsonTree(this));

    JsonObject obj = new JsonObject();
    obj.add("req", in);

    return obj.toString();
    }
}

至少有两种方法在根本上是不同的:

  • 使用允许您使用对象映射控制结果
  • 使用类型适配器(也可能是流式传输,但我不确定在Gson中是否可以为您提供)
让我们假设以下数据模型:

最终类用户{
最终字符串用户名;
最终管柱接触;
用户(最终字符串用户名、最终字符串联系人){
this.username=用户名;
this.contact=contact;
}
}
final类FooBar{
最后的国际粮食组织;
最终整型条;
FooBar(最终整型foo,最终整型bar){
this.foo=foo;
这个.bar=bar;
}
}
假设这两个应该压缩/合并

数据传输对象 结果DTO可能如下所示:

final类UserFooBarDto{
最终字符串用户名;
最终管柱接触;
最终整数foo;
最终整数条;
private UserFooBarDto(最终字符串用户名、最终字符串联系人、最终整数foo、最终整数条){
this.username=用户名;
this.contact=contact;
this.foo=foo;
这个.bar=bar;
}
静态UserFooBarDto UserFooBarDto(最终用户){
返回新的UserFooBarDto(user.username,user.contact,null,null);
}
静态UserFooBarDto UserFooBarDto(最终FooBar FooBar){
返回新的UserFooBarDto(null,null,fooBar.foo,fooBar.bar);
}
静态UserFooBarDto UserFooBarDto(最终用户,最终FooBar FooBar){
返回新的UserFooBarDto(user.username、user.contact、fooBar.foo、fooBar.bar);
}
}
然后,可以使用以下代码完成结果:

static void main(最终字符串…参数){
最终列表用户=ImmutableList.of(
新用户(“john.doe”、“john.doe”)。doe@mail.com"),
新用户(“alice.bob”、“alice.and”。bob@mail.com")
);
最终列表fooBars=ImmutableList.of(
新FooBar(1,2),
新FooBar(3,4),
新FooBar(5,6),
新FooBar(7,8)
);
最终列表zippedList=zip(用户、食物条、拉链);
最终字符串json=gson.toJson(zippedList);
System.out.println(json);
}
私有静态最终Gson Gson=new Gson();
//一次创建这样的对象是一个好主意,并在必要的地方使用它们,而不是反复实例化它们
专用静态最终IZipper拉链=新IZipper(){
@凌驾
公众名单{
返回新的ArrayList();
}
@凌驾
公共用户foobardto zip(最终用户,最终FooBar FooBar){
if(user!=null&&fooBar!=null){
返回userFooBarDto(用户,fooBar);
}else if(用户!=null){
返回userfoobardo(用户);
}else if(fooBar!=null){
返回userFooBarDto(fooBar);
}否则{
抛出新的断言错误();
}
}
};
//一个简单的zipper接口,它将告诉从何处收集压缩结果以及如何组合压缩结果元素
专用接口IZipper{
C.to();
O拉链(I1I1,I2I2);
}
私有静态压缩(

final Iterables意味着,您只想压缩/合并输出JSON中的列表?是的,两种类型的列表要使用Gson库添加到单个jsonobject中。我无法测试TypeAdapter代码。私有静态final Type userAndFooBarZippedListType=TypeToken.getParameterized(ZippedList.class,User.class,FooBar.class)。getType();创造error@AbishR它可能在最近的Gson版本中引入。我使用的是2.8.0。但是,我刚刚编辑了答案。谢谢@lyubmyr Shaydariv,它起作用了。但是json应该构建在单个对象中。它创建两个单独的json对象。从这两个列表中,它应该创建一个对象。@AbishR好的。您可以重新确认如果有必要,请验证它…您想要的JSON输出在结构上与上面的结果不匹配吗?重新配置JSON?我们不能。您的代码将输出为[{}],{}]
{
"list":[
    Obj{
    "Type_1_object_1":"value",
    "Type_1_object_2":"value",
    "Type_1_object_3":"value",
    "Type_2_object_5":"value",
    "Type_2_object_6":"value"
    },
    Obj{
    "Type_1_object_1":"value",
    "Type_1_object_2":"value",
    "Type_1_object_3":"value", 
    "Type_2_object_5":"value", 
    "Type_2_object_6":"value"
    }
]
}
[
    {
        "username": "john.doe",
        "contact": "john.doe@mail.com",
        "foo": 1,
        "bar": 2
    },
    {
        "username": "alice.bob",
        "contact": "alice.and.bob@mail.com",
        "foo": 3,
        "bar": 4
    },
    {
        "foo": 5,
        "bar": 6
    },
    {
        "foo": 7,
        "bar": 8
    }
]