久々に Google gson のデシリアライザを書いていて思いました。。
文字列のリスト、
import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Iterator; import java.util.List; 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; /** * List<String> の JsonDeserializer */ public class ListStringDeserialiser implements JsonDeserializer<List<String>>{ @Override public List<String> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException{ List<String> list = new ArrayList<>(); if (json.isJsonArray()){ JsonArray jary = json.getAsJsonArray(); for(Iterator<JsonElement> it=jary.iterator(); it.hasNext();){ list.add(it.next().getAsString()); } } return list; } }
この ListStringDeserialiser を registerTypeAdapter で登録すれば、
import com.google.gson.reflect.TypeToken;; Gson gson = new GsonBuilder().serializeNulls() .registerTypeAdapter(new TypeToken<List<String>>(){}.getType(), new ListGenericDeserialiser<List<String>>() .create();
JSON に、
{ "names" : [ "a", "b", "c" ] }
とあれば、fromJson を変換先のクラスに、List<String> names が存在すれば、
デシリアライズでのリストのセットがされます。
しかし、このようにプリミティブ型(String, Integer 等)である場合、
このようなJsonDeserializer の実装を registerTypeAdapter 登録することは不要です。
ListIntegerDeserialiser
ListDoubleDeserialiser
ListLocalDateDeserialiser
ListLocalDateTimeDeserialiser
なんて用意しても、役に立つかもしれません。