JSON到Java:如何将对象列表建模到通用对象类中,该类的JSON对象名是可变的

JSON到Java:如何将对象列表建模到通用对象类中,该类的JSON对象名是可变的,java,json,jackson,Java,Json,Jackson,假设我有以下JSON,我无法更改,因为它是由其他人通过web提要提供的。我想使用Jackson将其解析为Java对象 { "2002": [ { "d": "description", "t": "title" } ], "2003": [ { "d": "description", "t": "title" } ] } 比如说,这些数据代表一个ID为2002、2003等的电视节目列表,每个节目都有一个描述和标题。我想将这些数据解析成一个通用程序

假设我有以下JSON,我无法更改,因为它是由其他人通过web提要提供的。我想使用Jackson将其解析为Java对象

{
"2002": [
  {
    "d": "description",
    "t": "title"
  }
],
"2003": [
  {
    "d": "description",
    "t": "title"
  }
]
}
比如说,这些数据代表一个ID为2002、2003等的电视节目列表,每个节目都有一个描述和标题。我想将这些数据解析成一个通用程序类列表,其中每个程序类都有字段d和t。我不想为2002、2003等对象设置单独的类。请记住,2002年、2003年etc ID直到运行时才为人所知,可以随着时间的推移而演变,也可能是一个相当长的可能值列表

是否可以将其建模为id字段等于json字符串中对象名称名称的通用程序列表?换句话说,我不想这样:

public class AllProgrammes {
  private List<com.example._2002> _2002;
  private List<com.example._2003> _2003;
  // getters and setters
}
公共课程{
私人名单(2002),;
私人名单(2003),;
//接球手和接球手
}
但是它应该只包含
列表
,并且每个程序对象应该有一个id=2002或2003,或者任何id


谢谢。

如果您可以使用谷歌Gson,您可以这样做:

程序类

ProgramsDeserializer.class

import com.google.gson.JsonArray;
导入com.google.gson.JsonDeserializationContext;
导入com.google.gson.JsonDeserializer;
导入com.google.gson.JsonElement;
导入com.google.gson.JsonObject;
导入com.google.gson.JsonParseException;
导入java.lang.reflect.Type;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Map;
类程序序列化器实现JsonDeserializer{
@凌驾
公共列表反序列化(JsonElement e,类型类型,JsonDeserializationContext jdc)引发JsonParseException{
列表程序=新的ArrayList(10);
JsonObject root=e.getAsJsonObject();
for(Map.Entry:root.entrySet()){
String id=entry.getKey();
字符串标题=”;
字符串说明=”;
JsonElement arrayElement=entry.getValue();
if(arrayElement.isJsonArray()){
JsonArray数组=arrayElement.getAsJsonArray();
JsonElement objectElement=array.get(0);
if(objectElement.isJsonObject()){
JsonObject object=objectElement.getAsJsonObject();
title=object.get(“t”).getAsString();
description=object.get(“d”).getAsString();
}
}
添加(新程序(id、标题、说明));
}
返回程序;
}
}
GsonExample.class

import com.google.gson.gson;
导入com.google.gson.GsonBuilder;
导入com.google.gson.reflect.TypeToken;
导入java.lang.reflect.Type;
导入java.util.List;
导入java.util.logging.Level;
导入java.util.logging.Logger;
公共类gsone示例{
私有静态最终记录器Logger=Logger.getLogger(GsonExample.class.getName());
私有静态最终字符串JSON=
"{"
+ "\"2002\": ["
+ "{"
+“\”d\:\”描述\“
+“\“t\”:\“标题”
+ "}"
+ "],"
+ "\"2003\": ["
+ "{"
+“\”d\:\”描述\“
+“\“t\”:\“标题”
+ "}"
+ "]"
+ "}";
公共静态void main(字符串[]args){
GsonExample e=新的GsonExample();
e、 run();
}
私家车{
GsonBuilder=新的GsonBuilder();
Type Type=new-TypeToken(){}.getType();
registerTypeAdapter(类型,新程序序列化程序());
Gson Gson=builder.create();
List programs=gson.fromJson(JSON,类型);
logger.log(Level.INFO,“{0}”,程序);
}
}

非常好。谢谢看起来我的简单直接数据绑定还不够,但拥有自定义反序列化器看起来是一个非常灵活的解决方案。我相信您可能可以在jackson中执行类似的操作,但我很高兴切换到google gson,因为解析器之外的客户机代码都不依赖任何特定的具体json实现。
public class Program {
  private String id;
  private String title;
  private String description;

  public Program(String id, String title, String description) {
    this.id = id;
    this.title = title;
    this.description = description;
  }

  @Override
  public String toString() {
    return String.format("Program[id=%s, title=%s, description=%s]", this.id, this.title, this.description);
  }
}
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

class ProgramsDeserializer implements JsonDeserializer<List<Program>> {
  @Override
  public List<Program> deserialize(JsonElement e, Type type, JsonDeserializationContext jdc) throws JsonParseException {
    List<Program> programs = new ArrayList<>(10);
    JsonObject root = e.getAsJsonObject();
    for (Map.Entry<String, JsonElement> entry : root.entrySet()) {
      String id = entry.getKey();
      String title = "";
      String description = "";
      JsonElement arrayElement = entry.getValue();
      if (arrayElement.isJsonArray()) {
        JsonArray array = arrayElement.getAsJsonArray();
        JsonElement objectElement = array.get(0);
        if (objectElement.isJsonObject()) {
          JsonObject object = objectElement.getAsJsonObject();
          title = object.get("t").getAsString();
          description = object.get("d").getAsString();
        }
      }
      programs.add(new Program(id, title, description));
    }
    return programs;
  }
}
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class GsonExample {
  private static final Logger logger = Logger.getLogger(GsonExample.class.getName());
  private static final String JSON = 
    "{"
      + "\"2002\": ["
        + "{"
          + "\"d\": \"description\","
          + "\"t\": \"title\""
        + "}"
      + "],"
      + "\"2003\": ["
        + "{"
          + "\"d\": \"description\","
          + "\"t\": \"title\""
        + "}"
      + "]"
    + "}";

  public static void main(String[] args) {
    GsonExample e = new GsonExample();
    e.run();
  }

  private void run() {
    GsonBuilder builder = new GsonBuilder();
    Type type = new TypeToken<List<Program>>(){}.getType();
    builder.registerTypeAdapter(type, new ProgramsDeserializer());
    Gson gson = builder.create();
    List<Program> programs = gson.fromJson(JSON, type);
    logger.log(Level.INFO, "{0}", programs);
  }
}