您正在NullPointerException
访问queryStudent
您的MapObject
内部MapModel
,因为当您尝试反序列化您的Json时它没有正确填充。
因此,要解决您的问题,请查看Gson 文档,您可以在其中看到:
您可以使用 Gson 序列化集合,而无需执行任何特定操作: toJson(collection) 会写出所需的输出。
但是,使用 fromJson(json, Collection.class) 进行反序列化将不起作用,因为 Gson 无法知道如何将输入映射到类型。Gson 要求您在 fromJson() 中提供集合类型的通用版本。所以,你有三个选择:
使用 Gson 的解析器 API(低级流解析器或 DOM 解析器 JsonParser)解析数组元素,然后对每个数组元素使用 Gson.fromJson()。这是首选方法。这是一个演示如何执行此操作的示例。
为 Collection.class 注册一个类型适配器,该适配器查看每个数组成员并将它们映射到适当的对象。这种方法的缺点是它会破坏 Gson 中其他集合类型的反序列化。
为 MyCollectionMemberType 注册一个类型适配器并将 fromJson() 与 Collection 一起使用。
由于您MapObject
的包含 ajava.util.Map
但您的类本身不是通用的,因此我认为您的案例的一个好方法是创建一个Deserializer
.
在此之前尝试清理您的类定义,提供构造函数以使反序列化器易于构建。您的POJO类可能是:
学生班
public class Student{
public String date;
public String seqId;
public String status;
public Student(String date, String seqId, String status){
this.date = date;
this.seqId = seqId;
this.status = status;
}
}
地图对象类
注意:我更改了您Map
的定义,因为在您的Json中似乎每个学生可能有多个学生DynamicName
(DynamicName2
从您的问题中查看),所以我使用Map<String,List<Student>>
而不是Map<String,Student>
:
public class MapObject{
public Map<String,List<Student>> queryStudent;
public MapObject(Map<String,List<Student>> value){
this.queryStudent = value;
}
}
地图模型类
public class MapModel {
public MapObject map;
}
Deserializer
现在为您创建一个MapObject
:
public class MapObjectDeserializer implements JsonDeserializer<MapObject> {
public MapObject deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
Map<String,List<Student>> queryStudents = new HashMap<String,List<Student>>();
// for each DynamicElement...
for (Map.Entry<String,JsonElement> entry : json.getAsJsonObject().entrySet()) {
List<Student> students = new ArrayList<Student>();
// each dynamicElement has an Array so convert and add an student
// for each array entry
for(JsonElement elem : entry.getValue().getAsJsonArray()){
students.add(new Gson().fromJson(elem,Student.class));
}
// put the dinamic name and student on the map
queryStudents.put(entry.getKey(),students);
}
// finally create the mapObject
return new MapObject(queryStudents);
}
}
最后注册Deserializer
并解析你的Json:
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(MapObject.class, new MapObjectDeserializer());
Gson gson = builder.create();
MapModel object = gson.fromJson(YourJson,MapModel.class);
免责声明:对于快速原型设计,我使用groovy对此进行了测试,我尝试保留Java语法,但我可能会忘记一些东西,无论如何我认为这可以让你朝着正确的方向前进。
希望能帮助到你,