Java 以通用方式处理JSON响应

Java 以通用方式处理JSON响应,java,arrays,json,Java,Arrays,Json,我从两个不同的请求中生成了两个不同的Json响应(具有不同的键): 响应1: { "response": { "count": 2, "programs": [ { "title": "xyz1", "desc": "ABCDEF1" }, { "title": "xyz2",

我从两个不同的请求中生成了两个不同的Json响应(具有不同的键):

响应1:

{
    "response": {
        "count": 2,
        "programs": [
            {
                "title": "xyz1",
                "desc": "ABCDEF1"
            },
            {
                "title": "xyz2",
                "desc": "ABCDEF2"
            }
        ]
    }
}
响应2

{
    "response": {
        "count": 3,
        "shows": [
            {
                "name": "PQR1",
                "desc": "qwerty1"
            },
            {
                "name": "PQR2",
                "desc": "qwerty2"
            },
            {
                "name": "PQR3",
                "desc": "qwerty3"
            }
        ]
    }
}
正如我们所见,响应包含具有不同键的数据。但最终它可以被转换成相同的Java对象(数组),如下所示:

Program {
   String title;
   int description;
}
我想编写一个解析逻辑来处理不同的键名,并返回程序列表。如何有效地实现这一点


是否有任何库可以方便地执行此操作?

当对两个字段进行反序列化时,您可以在getter中选择该字段(示例适用于):

另外(同样是
GSON
),您可以在创建
GSON
对象时注册自己的
TypeAdapter

// let Program have empty constructor (or no constructors at all), getters and setters
class ProgramAdapter extends TypeAdapter<Program> {

    @Override
    public Program read(final JsonReader in) throws IOException {
        final Program obj = new Program();

        in.beginObject();
        while (in.hasNext()) {
            String jsonTag = in.nextName();
            if ("desc".equals(jsonTag)) {
                obj.setDescription(in.nextString());
            } else if ("title".equals(jsonTag) 
                    || "name".equals(jsonTag)) {
                obj.setTitle(in.nextString());
            }
        }
        in.endObject();

        return obj;
    }

    @Override
    public void write(final JsonWriter out, final Program obj)
            throws IOException {
        out.beginObject();
        out.name("title").value(obj.getTitle());
        out.name("desc").value(obj.getDescription());
        out.endObject();
    }
}

// then, when create `Gson` object:

Gson gson = new GsonBuilder().registerTypeAdapter(Program.class, new ProgramAdapter()).create();
//让程序有空构造函数(或者根本没有构造函数)、getter和setter
类ProgramAdapter扩展了TypeAdapter{
@凌驾
公共程序读取(最终JsonReader in)引发IOException{
最终程序obj=新程序();
in.beginObject();
while(在.hasNext()中){
字符串jsonTag=in.nextName();
如果(“desc.”等于(jsonTag)){
obj.setDescription(在.nextString()中);
}else if(“title.”等于(jsonTag)
||“name”.equals(jsonTag)){
obj.setTitle(在.nextString()中);
}
}
in.endObject();
返回obj;
}
@凌驾
公共无效写入(最终JsonWriter out,最终程序obj)
抛出IOException{
out.beginObject();
out.name(“title”).value(obj.getTitle());
out.name(“desc”).value(obj.getDescription());
out.endObject();
}
}
//然后,在创建`Gson`对象时:
Gson Gson=new GsonBuilder().registerTypeAdapter(Program.class,new ProgramAdapter()).create();

当对两个字段进行反序列化时,您可以选择getter中的字段(示例适用于):

另外(同样是
GSON
),您可以在创建
GSON
对象时注册自己的
TypeAdapter

// let Program have empty constructor (or no constructors at all), getters and setters
class ProgramAdapter extends TypeAdapter<Program> {

    @Override
    public Program read(final JsonReader in) throws IOException {
        final Program obj = new Program();

        in.beginObject();
        while (in.hasNext()) {
            String jsonTag = in.nextName();
            if ("desc".equals(jsonTag)) {
                obj.setDescription(in.nextString());
            } else if ("title".equals(jsonTag) 
                    || "name".equals(jsonTag)) {
                obj.setTitle(in.nextString());
            }
        }
        in.endObject();

        return obj;
    }

    @Override
    public void write(final JsonWriter out, final Program obj)
            throws IOException {
        out.beginObject();
        out.name("title").value(obj.getTitle());
        out.name("desc").value(obj.getDescription());
        out.endObject();
    }
}

// then, when create `Gson` object:

Gson gson = new GsonBuilder().registerTypeAdapter(Program.class, new ProgramAdapter()).create();
//让程序有空构造函数(或者根本没有构造函数)、getter和setter
类ProgramAdapter扩展了TypeAdapter{
@凌驾
公共程序读取(最终JsonReader in)引发IOException{
最终程序obj=新程序();
in.beginObject();
while(在.hasNext()中){
字符串jsonTag=in.nextName();
如果(“desc.”等于(jsonTag)){
obj.setDescription(在.nextString()中);
}else if(“title.”等于(jsonTag)
||“name”.equals(jsonTag)){
obj.setTitle(在.nextString()中);
}
}
in.endObject();
返回obj;
}
@凌驾
公共无效写入(最终JsonWriter out,最终程序obj)
抛出IOException{
out.beginObject();
out.name(“title”).value(obj.getTitle());
out.name(“desc”).value(obj.getDescription());
out.endObject();
}
}
//然后,在创建`Gson`对象时:
Gson Gson=new GsonBuilder().registerTypeAdapter(Program.class,new ProgramAdapter()).create();

当对两个字段进行反序列化时,您可以选择getter中的字段(示例适用于):

另外(同样是
GSON
),您可以在创建
GSON
对象时注册自己的
TypeAdapter

// let Program have empty constructor (or no constructors at all), getters and setters
class ProgramAdapter extends TypeAdapter<Program> {

    @Override
    public Program read(final JsonReader in) throws IOException {
        final Program obj = new Program();

        in.beginObject();
        while (in.hasNext()) {
            String jsonTag = in.nextName();
            if ("desc".equals(jsonTag)) {
                obj.setDescription(in.nextString());
            } else if ("title".equals(jsonTag) 
                    || "name".equals(jsonTag)) {
                obj.setTitle(in.nextString());
            }
        }
        in.endObject();

        return obj;
    }

    @Override
    public void write(final JsonWriter out, final Program obj)
            throws IOException {
        out.beginObject();
        out.name("title").value(obj.getTitle());
        out.name("desc").value(obj.getDescription());
        out.endObject();
    }
}

// then, when create `Gson` object:

Gson gson = new GsonBuilder().registerTypeAdapter(Program.class, new ProgramAdapter()).create();
//让程序有空构造函数(或者根本没有构造函数)、getter和setter
类ProgramAdapter扩展了TypeAdapter{
@凌驾
公共程序读取(最终JsonReader in)引发IOException{
最终程序obj=新程序();
in.beginObject();
while(在.hasNext()中){
字符串jsonTag=in.nextName();
如果(“desc.”等于(jsonTag)){
obj.setDescription(在.nextString()中);
}else if(“title.”等于(jsonTag)
||“name”.equals(jsonTag)){
obj.setTitle(在.nextString()中);
}
}
in.endObject();
返回obj;
}
@凌驾
公共无效写入(最终JsonWriter out,最终程序obj)
抛出IOException{
out.beginObject();
out.name(“title”).value(obj.getTitle());
out.name(“desc”).value(obj.getDescription());
out.endObject();
}
}
//然后,在创建`Gson`对象时:
Gson Gson=new GsonBuilder().registerTypeAdapter(Program.class,new ProgramAdapter()).create();

当对两个字段进行反序列化时,您可以选择getter中的字段(示例适用于):

另外(同样是
GSON
),您可以在创建
GSON
对象时注册自己的
TypeAdapter

// let Program have empty constructor (or no constructors at all), getters and setters
class ProgramAdapter extends TypeAdapter<Program> {

    @Override
    public Program read(final JsonReader in) throws IOException {
        final Program obj = new Program();

        in.beginObject();
        while (in.hasNext()) {
            String jsonTag = in.nextName();
            if ("desc".equals(jsonTag)) {
                obj.setDescription(in.nextString());
            } else if ("title".equals(jsonTag) 
                    || "name".equals(jsonTag)) {
                obj.setTitle(in.nextString());
            }
        }
        in.endObject();

        return obj;
    }

    @Override
    public void write(final JsonWriter out, final Program obj)
            throws IOException {
        out.beginObject();
        out.name("title").value(obj.getTitle());
        out.name("desc").value(obj.getDescription());
        out.endObject();
    }
}

// then, when create `Gson` object:

Gson gson = new GsonBuilder().registerTypeAdapter(Program.class, new ProgramAdapter()).create();
//让程序有空构造函数(或者根本没有构造函数)、getter和setter
类ProgramAdapter扩展了TypeAdapter{
@凌驾
公共程序读取(最终JsonReader in)引发IOException{
最终程序obj=新程序();
in.beginObject();
while(在.hasNext()中){
字符串jsonTag=in.nextName();
如果(“desc.”等于(jsonTag)){
obj.setDescription(在.nextString()中);
}else if(“title.”等于(jsonTag)
||“name”.equals(jsonTag)){
obj.setTitle(在.nextString()中);
}
}
in.endObject();
返回obj;
}
@凌驾
公共无效写入(最终JsonWriter out,最终程序obj)
抛出IOException{
out.beginObject();
out.name(“title”).value(obj.getTitle());
out.name(“desc”).value(obj.getDescription());
out.endObject();
}
}
//然后,在创建`Gson`对象时:
Gson Gson=new GsonBuilder().registerTypeAdapter(Program.class,new ProgramAdapter()).create();

可能重复的问题您有没有看过关于堆栈溢出的其他问题,询问如何用java解析json?我知道一些方法