Java 如何使用GSON和GS2反序列化多形状JSON响应?
我有一个restApi,它的响应可以是这样的(如果只有一个对象要返回): 或者,如果还有更多,请这样做:Java 如何使用GSON和GS2反序列化多形状JSON响应?,java,android,json,gson,retrofit2,Java,Android,Json,Gson,Retrofit2,我有一个restApi,它的响应可以是这样的(如果只有一个对象要返回): 或者,如果还有更多,请这样做: { "keys": [ { "id":0, "name":"john", "pItems":12 }, { "id":0, "name":"john", "pItems":12
{
"keys":
[
{
"id":0,
"name":"john",
"pItems":12
},
{
"id":0,
"name":"john",
"pItems":12
}
]
}
当我为模型对象使用列表时,第一种情况不起作用。
如何使用Gson和Reformation2对其进行反序列化?好的,您不能更改响应的设计,但您确定只能接收这些响应吗?如果是这样的话,也许你可以创造这样的东西:
class Response{
public Object keys
}
class UserResponse{
public int id;
public String name;
public int pItems;
}
因此,您将有两个案例:
if (keys instanceof List<?>){
// then keys is a list
}else{
// then keys is a single object UserResponse
}
if(键列表实例){
//然后是一个列表
}否则{
//然后keys是一个单一的对象UserResponse
}
您可以检查键
元素是否为数组,然后进行相应的反序列化
假设您的模型类是UserWrapper.java
import java.util.List;
公共类用户包装器{
私有列表密钥;
公共列表getKeys(){
返回键;
}
公共无效设置键(列表键){
this.keys=keys;
}
}
java是对应于keys
属性的每个元素的类
公共类用户{
私有int-id;
私有字符串名称;
私有内部陷阱;
公共int getId(){
返回id;
}
公共无效集合id(内部id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共int getPitems(){
返回坑;
}
公共无效集合点(内部集合点){
this.pitems=pitems;
}
}
根据键的类型反序列化的代码
import java.util.ArrayList;
导入java.util.List;
导入com.google.gson.gson;
导入com.google.gson.GsonBuilder;
导入com.google.gson.JsonElement;
导入com.google.gson.reflect.TypeToken;
公共类GsonMain{
私有静态字符串json=“您的json”;
公共静态void main(字符串[]args){
Gson Gson=new GsonBuilder().create();
JsonElement=gson.fromJson(json,JsonElement.class);
JsonElement keyselement=JsonElement.getAsJsonObject().get(“keys”);
UserWrapper UserWrapper=新的UserWrapper();
if(keyselement.isJsonObject()){
setKeys(新的ArrayList());
User=gson.fromJson(keyselement,User.class);
userWrapper.getKeys().add(用户);
}else if(keyselement.isJsonArray()){
List users=gson.fromJson(keyselement,new-TypeToken()){
}.getType());
userWrapper.setKeys(用户);
}
userWrapper.getKeys().forEach(user->System.out.println(user.getName());
}
}
如果具有相同名称的属性可以是列表或单个对象,则这不是一个好的设计。您可以编写一个自定义反序列化程序,将大小写的单个对象转换为列表。@微笑我知道这是一个非常糟糕的设计,但restApi不是我的!我只是想用它
if (keys instanceof List<?>){
// then keys is a list
}else{
// then keys is a single object UserResponse
}