Ilya的解决方案忽略类型参数,因此在一般情况下它实际上无法工作。我的解决方案相当复杂,因为需要区分
null和
Optional.absent()-否则您可以将封装剥离为列表。
public class GsonOptionalDeserializer<T>implements JsonSerializer<Optional<T>>, JsonDeserializer<Optional<T>> { @Override public Optional<T> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { final JsonArray asJsonArray = json.getAsJsonArray(); final JsonElement jsonElement = asJsonArray.get(0); final T value = context.deserialize(jsonElement, ((ParameterizedType) typeOfT).getActualTypeArguments()[0]); return Optional.fromNullable(value); } @Override public JsonElement serialize(Optional<T> src, Type typeOfSrc, JsonSerializationContext context) { final JsonElement element = context.serialize(src.orNull()); final JsonArray result = new JsonArray(); result.add(element); return result; }}


