Java 以通用方式处理JSON响应
我从两个不同的请求中生成了两个不同的Json响应(具有不同的键): 响应1:Java 以通用方式处理JSON响应,java,arrays,json,Java,Arrays,Json,我从两个不同的请求中生成了两个不同的Json响应(具有不同的键): 响应1: { "response": { "count": 2, "programs": [ { "title": "xyz1", "desc": "ABCDEF1" }, { "title": "xyz2",
{
"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?我知道一些方法