Синтаксический анализ пустой строки с помощью Gson возвращает null вместо исключения JsonSyntaxException

#java #gson

#java #gson

Вопрос:

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

 gson.getAdapter(Foo.class).fromJson("")
  

вместо

 gson.fromJson("", Foo.class)
  

Проблема, с которой я сталкиваюсь, заключается в том, что это не работает, когда gson у рассматриваемого объекта зарегистрирован пользовательский адаптер. Кто-нибудь может предложить другой обходной путь для прохождения этого модульного теста:

 @Test
public void testEmptyStringBehavior() {
    Gson gson = new GsonBuilder().registerTypeAdapter(Foo.class, new JsonDeserializer<Foo>() {
        @Override
        public Foo deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            throw new JsonSyntaxException("Never gets here");
        }
    }).create();
    try {
        gson.getAdapter(Foo.class).fromJson("");
        fail("Expected JsonSyntaxException");
    } catch (JsonSyntaxException | IOException e) {
        // Expected.
    }
}
  

Ответ №1:

лучше использовать jackson , а не использовать Gson , это очень просто.

 package parse;

import java.io.IOException;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonParsing {

    public static void main(String[] args) {
        String jsonString = "";

        try {

            ObjectMapper mapper = new ObjectMapper();
            JsonNode node = mapper.readTree(jsonString);

        } catch (JsonProcessingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
  

здесь я использую пустую строку jsonString, с помощью которой она генерирует исключение com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input

Комментарии:

1. Спасибо за предложение, но на самом деле оно не отвечает на мой вопрос. Для начала, я использую Gson на большой базе кода — не могу просто переключиться на Jackson. Во-вторых, ваш пример десериализуется не в Foo объект, а в JsonNode .