1
{
"localeCode": "",
"map": {
    "DynamicName1": [],
    "DynamicName2": [
        {
            "date": "2016-05-15T00:00:00",
            "seqId": 1,
            "status": 10
        },
        {
            "date": "2016-05-16T00:00:00",
            "seqId": 83,
            "status": 10
        }
    ],
    "DynamicName3": [],
    "DynamicName4": []
},
"respCode": 100,
"respMsg": "success",
"status": 1
}

如何正确映射这种 json。如果你能看到,Dynamic是一个动态名称。到目前为止,我已经这样做了:

public class MapModel {

public MapObject map;

public static class MapObject{
    public java.util.Map<String, Student> queryStudent;

    public static class Student{
        public String date;
        public String seqId;
        public String status;
    }
}
}

但是当运行应用程序时。我得到NullPointerException。有人可以帮助我吗?

4

1 回答 1

3

您正在NullPointerException访问queryStudent您的MapObject内部MapModel,因为当您尝试反序列化您的Json时它没有正确填充。

因此,要解决您的问题,请查看Gson 文档,您可以在其中看到:

您可以使用 Gson 序列化集合,而无需执行任何特定操作: toJson(collection) 会写出所需的输出。

但是,使用 fromJson(json, Collection.class) 进行反序列化将不起作用,因为 Gson 无法知道如何将输入映射到类型。Gson 要求您在 fromJson() 中提供集合类型的通用版本。所以,你有三个选择:

  1. 使用 Gson 的解析器 API(低级流解析器或 DOM 解析器 JsonParser)解析数组元素,然后对每个数组元素使用 Gson.fromJson()。这是首选方法。这是一个演示如何执行此操作的示例。

  2. 为 Collection.class 注册一个类型适配器,该适配器查看每个数组成员并将它们映射到适当的对象。这种方法的缺点是它会破坏 Gson 中其他集合类型的反序列化。

  3. 为 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中似乎每个学生可能有多个学生DynamicNameDynamicName2从您的问题中查看),所以我使用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语法,但我可能会忘记一些东西,无论如何我认为这可以让你朝着正确的方向前进。

希望能帮助到你,

于 2016-05-18T11:07:07.433 回答