Вы получаете доступ к NullPointerException
queryStudent
из ваших MapObject
внутри вашего MapModel
, так как это не правильно заправить, когда вы пытаетесь десериализации вашего JSon.
Итак, чтобы решить вашу проблему взглянуть на Gson documentation, где вы можете увидеть:
Вы можете сериализовать коллекцию с Gson ничего не делая специфический: toJson (сбор) будет выписывать желаемый результат.
Однако десериализация с помощью json (json, Collection.class) будет не работать, поскольку Gson не имеет способа узнать, как сопоставить ввод с типами . Gson требует, чтобы вы предоставили обобщенную версию коллекции в fromJson(). Таким образом, у вас есть три варианта:
Используйте Gson в анализатор (API низкого уровня потокового парсер или DOM парсер JsonParser) для анализа элементов массива, а затем использовать Gson.fromJson() на каждом из массива элементов. Это предпочтительный подход. Вот пример: пример, демонстрирующий, как это сделать.
Зарегистрируйте адаптер типа Collection.class, который смотрит на каждый из элементов массива и сопоставляет их соответствующим объектам. Недостатком этого подхода является то, что он приведет к десериализации других типов коллекций в Гсоне.
Зарегистрируйте адаптер типа MyCollectionMemberType и используйте функциюJson() с коллекцией.
С вашим MapObject
containts java.util.Map
, но сам ваш класс, это не общий, я считаю, что хороший подход для Вашего случая является создание Deserializer
.
Перед этим попробуйте очистить определение класса, чтобы предоставить конструкторам, чтобы облегчить сбор десериализатора.Ваш POJO классы могут быть:
класс Student
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;
}
}
MapObject класс
Примечание: меняю вам 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;
}
}
MapModel класс
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);
ПРЕДУПРЕЖДЕНИЕ: Для быстрого прототипирования я проверить это с помощью заводной, я стараюсь держать Java синтаксис, но я могу забыть что-то, во всяком случае, я думаю, что это может поставить вас на правильном направлении.
Надеюсь, это поможет,
Вы решили? – Bharatesh
проверить этот ответ, он показывает, как получить ключи в объекте, я думаю, вам нужно сделать это вручную, чтобы получить все ключи в «карте» и перебрать по http://stackoverflow.com/questions/31094305/java- gson пробивной-The-список-из всех клавиш-под-а-JSONObject – Yazan