Gson のデシリアライザ、以下を用意すれば何でもリストをデシリアライズできる
import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.function.Function; import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; /** * ListGenericDeserialiser */ public class ListGenericDeserialiser<T> implements JsonDeserializer<List<T>>{ private Function<JsonElement, T> function; public ListGenericDeserialiser(Function<JsonElement, T> function){ this.function = function; } @Override public List<T> deserialize(JsonElement json, Type typeOfT , JsonDeserializationContext context) throws JsonParseException{ List<T> list = new ArrayList<>(); if (!json.isJsonNull()){ if (json.isJsonArray()){ for(JsonElement je:json.getAsJsonArray()){ list.add(function.apply(je)); } } } return list; } }
例えば、Foo というクラス、String name 属性を持っているなら、、
import com.google.gson.reflect.TypeToken; Gson gson = new GsonBuilder().serializeNulls() .registerTypeAdapter(new TypeToken<List<Foo>>(){}.getType() , new ListGenericDeserialiser<Foo>(je->{ Foo f = new Foo(); je.getAsJsonObject().entrySet().forEach(e->{ if ( !e.getValue().isJsonNull() && e.getKey().equals("name")){ f.name = e.getValue().getAsString(); } }); return f; })) .setPrettyPrinting() .create();
{ "foolist" : [ { "name" : "あ" }, { "name" : "い" } ] }
List<Foo> foolist; というリストに、Gson の fromJson で格納してくる。