2016-05-17 4 views
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 - это динамическое имя. До сих пор я это сделал:Как использовать динамическое значение json для моего класса POJO с Gson?

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. Может кто-нибудь мне помочь?

+0

Вы решили? – Bharatesh

+0

проверить этот ответ, он показывает, как получить ключи в объекте, я думаю, вам нужно сделать это вручную, чтобы получить все ключи в «карте» и перебрать по http://stackoverflow.com/questions/31094305/java- gson пробивной-The-список-из всех клавиш-под-а-JSONObject – Yazan

ответ

1

Вы получаете доступ к NullPointerExceptionqueryStudent из ваших MapObject внутри вашего MapModel, так как это не правильно заправить, когда вы пытаетесь десериализации вашего JSon.

Итак, чтобы решить вашу проблему взглянуть на Gson documentation, где вы можете увидеть:

Вы можете сериализовать коллекцию с Gson ничего не делая специфический: toJson (сбор) будет выписывать желаемый результат.

Однако десериализация с помощью json (json, Collection.class) будет не работать, поскольку Gson не имеет способа узнать, как сопоставить ввод с типами . Gson требует, чтобы вы предоставили обобщенную версию коллекции в fromJson(). Таким образом, у вас есть три варианта:

  1. Используйте Gson в анализатор (API низкого уровня потокового парсер или DOM парсер JsonParser) для анализа элементов массива, а затем использовать Gson.fromJson() на каждом из массива элементов. Это предпочтительный подход. Вот пример: пример, демонстрирующий, как это сделать.

  2. Зарегистрируйте адаптер типа Collection.class, который смотрит на каждый из элементов массива и сопоставляет их соответствующим объектам. Недостатком этого подхода является то, что он приведет к десериализации других типов коллекций в Гсоне.

  3. Зарегистрируйте адаптер типа 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 синтаксис, но я могу забыть что-то, во всяком случае, я думаю, что это может поставить вас на правильном направлении.

Надеюсь, это поможет,