Как создать десерилизацию Gson, которая обрабатывает всю строку одним способом, кроме одного поля?

#java #gson

#java #gson

Вопрос:

Я создал десериализацию, которая всякий раз, когда она видит строку «nil», возвращает null.

 private static Gson createCustomGson() {
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(String.class, new JsonDeserializer<String>() {
        @Override
        public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
            return (json.getAsString().equals("nil")) ? null : json.getAsString();
        }
    });
    return gsonBuilder.create();
}
  

Это работает хорошо, за исключением того, что я хочу добавить исключение, где для поля «Ключевое слово», в котором хранится список, я не хочу исключать nil для возврата null, но сохранить строку. Как добавить исключение для «Ключевого слова»?

Мое ключевое слово class имеет следующий тип

 public class KeywordListing implements Serializable {
    List<String> keys;
}
  

Ответ №1:

Найдено решение. Это путем добавления другого TypeAdapter для возврата десериализации по умолчанию из Gson, как показано ниже.

 private static Gson createCustomGson() {
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(String.class, new JsonDeserializer<String>() {
        @Override
        public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
            return (json.getAsString().equals("nil")) ? null : json.getAsString();
        }
    });
    gsonBuilder.registerTypeAdapter(KeywordListing.class, new JsonDeserializer< KeywordListing >() {
                @Override
                public KeywordListing deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
                    return new Gson().fromJson(json, KeywordListing.class);
                }
            });

    return gsonBuilder.create();
}
  

Дайте мне знать, если есть более короткий ответ, чем тот, который я получил выше.