Gsonデシリアライザ ラムダで。

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();

JSON

{
  "foolist" : [
               { "name" : "あ" },
               { "name" : "い" }
            ]
}

List<Foo> foolist; というリストに、Gson の fromJson で格納してくる。


Gsonデシリアライザ、汎用化? - Oboe吹きプログラマの黙示録