GSON избегает JsonSyntaxException возвращает частичное отображение

Я получаю эту проблему, я не хочу решать эту проблему, но найти способ сказать GSON «пропустить ошибки и продолжить» разбор:

Can't parses json : java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 16412 

Используемый код:

 JsonReader reader = new JsonReader(new StringReader(data)); reader.setLenient(true); Articles articles = gson.create().fromJson(reader, Articles.class); 

Данные (для упрощения): Статьи-> Страницы-> medias.fields. Одно поле в текущей ошибке определяется как строка, но я получаю объект (но опять же это только одно вхождение). Я не могу добавлять защиту повсюду, поэтому мой вопрос: «есть ли пропуск и продолжается в GSON?

Я хочу избежать JsonSysntaxException с помощью GSON, когда есть проблема на узле, и я ожидаю, что, по крайней мере, вы получите парсиальные частичные данные. В моем случае у меня было бы 99,999% данных, и только мое неправильное поле было бы нулевым … Я знаю, что это кажется не чистым, но я бы включил «строгий режим» для модульного теста или непрерывной интеграции для обнаружения проблемы и для производства. Включите «мягкий режим», чтобы мое приложение могло запускаться (даже когда серверная сторона делала ошибки). Я не могу сказать, что ваше приложение не может быть запущено, потому что в статье есть данные недействительные.

Есть ли у GSON «пропустить и продолжить по ошибке»?

Я думаю, что ответ просто: нет, вообще не может.

Из-за рекурсивного синтаксического анализа библиотеки, если что-то не так, это может вызвать какое-то исключение. Было бы интересно, если бы вы могли опубликовать SSCCE своей проблемы, чтобы поэкспериментировать, если можно создать настраиваемый адаптер типа, который обрабатывает лучшие исключения.

Вот решение: вам нужно создать TypeAdapterFactory, который позволит вам перехватывать по умолчанию TypeAdapter, но при этом оставить доступ к стандартным TypeAdapter как делегату. Затем вы можете просто попытаться прочитать значение с помощью делегирования из TypeAdapter по умолчанию и обработать неожиданные данные по вашему желанию.

  public Gson getGson() { return new GsonBuilder() .registerTypeAdapterFactory(new LenientTypeAdapterFactory()) .create(); } class LenientTypeAdapterFactory implements TypeAdapterFactory { public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type); return new TypeAdapter<T>() { public void write(JsonWriter out, T value) throws IOException { delegate.write(out, value); } public T read(JsonReader in) throws IOException { try { //Here is the magic //Try to read value using default TypeAdapter return delegate.read(in); } catch (JsonSyntaxException e) { //If we can't in case when we expecting to have an object but array is received (or some other unexpected stuff), we just skip this value in reader and return null in.skipValue(); return null; } } }; } }