2013-06-27 3 views
6

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

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 имеют " пропустить и продолжить по ошибке "?

+0

показать нам код ?? – ajduke

+0

может отправить сообщение от веб-службы, это поможет больше решить проблему ур. – KOTIOS

+0

Я добавил код, и я не хочу исправлять эту проблему, но найти способ не инициировать это исключение, когда только узел leaf/a влияет плохой формат. Является ли это возможным ? – Gros

ответ

2

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

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

1

Решение этой проблемы: Вам необходимо создать 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; 
          } 
         } 
        }; 
       } 
    }