Jsonを逆シリアル化しようとしているときに正しく入力されていないため、内部にNullPointerException
アクセスしています。queryStudent
MapObject
MapModel
したがって、問題を解決するには、Gson のドキュメントを参照してください。
具体的なことを何もせずに Gson を使用してコレクションをシリアル化できます。 toJson(collection) は目的の出力を書き出します。
ただし、Gson は入力を型にマップする方法を知る方法がないため、fromJson(json, Collection.class) を使用した逆シリアル化は機能しません。Gson では、fromJson() でコレクション型の汎用バージョンを提供する必要があります。したがって、次の 3 つのオプションがあります。
Gson のパーサー API (低レベルのストリーミング パーサーまたは DOM パーサー JsonParser) を使用して配列要素を解析し、各配列要素で Gson.fromJson() を使用します。これが推奨される方法です。これを行う方法を示す例を次に示します。
各配列メンバーを調べて適切なオブジェクトにマップする Collection.class の型アダプターを登録します。このアプローチの欠点は、Gson の他のコレクション型の逆シリアル化を台無しにすることです。
MyCollectionMemberType の型アダプターを登録し、Collection で fromJson() を使用します。
あなたMapObject
の内容は ajava.util.Map
ですが、クラス自体は一般的ではないため、あなたの場合の良いアプローチは a を作成することだと思います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;
}
}
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);
}
}
最後に、 JsonDeserializer
を登録して解析します。
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(MapObject.class, new MapObjectDeserializer());
Gson gson = builder.create();
MapModel object = gson.fromJson(YourJson,MapModel.class);
免責事項: 迅速なプロトタイピングのために、 groovyを使用してこれをテストします。Java構文を維持しようとしますが、何かを忘れることがあります。とにかく、これで正しい方向に進むことができると思います。
それが役に立てば幸い、