2014-12-10 16 views
5

Mam dziwne zachowanie podczas analizowania json z gsonem. Używam tego kodu:Wyjątek JsonSyntaxException z powodu IllegalState of gson

private static Container parseContainer(String containerJson) { 

    try { 
     //TODO Remove try catch when Bug is done 
     return containerJson != null ? new Gson().fromJson(containerJson, Container.class) 
       : null; 

    } catch (JsonSyntaxException e) { 
     LOGGER.error("JsonSyntaxException ", e); 
     LOGGER.error("Json: " + containerJson); 

     //Sleep 3 minutes and try again. 
     try { 
      Thread.sleep(1000L * 60 * 3); 
     } catch (InterruptedException e1) { 
      LOGGER.error("Exception", e); 
     } 

     LOGGER.error("Try again to parse json: " + containerJson); 

     Container result = new Gson().fromJson(containerJson, Container.class); 

     LOGGER.error("Parsing successful on second try."); 

     return result; 
    } 

} 

Kiedy metoda jest wywoływana w moim projekcie, zwykle działa bez rzucania wyjątku. Ale czasami wyjątek jest rzucany i po odczekaniu jakiegoś czasu, parsowanie działa dobrze.

Nie wiem, kiedy wyjątek jest rzucany, a kiedy nie.

W jaki sposób dziennik "Parsowanie zakończone powodzeniem przy drugiej próbie" może zostać zarejestrowany?

Wyjątkiem jest

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException 
at  com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapt erFactory.java:176) 
at com.google.gson.Gson.fromJson(Gson.java:803) 
at com.google.gson.Gson.fromJson(Gson.java:768) 
at com.google.gson.Gson.fromJson(Gson.java:717) 
at com.google.gson.Gson.fromJson(Gson.java:689) 
+0

Wydaje się, że wyjątek jest zgłaszany na wywołanie fromJson tuż przed wydrukiem dziennika "Parsing successfull on second try". Czy możesz pokazać tutaj wadliwy JSON? –

+0

Zaloguj się do JSON-a do logcat, zanim spróbujesz go przeanalizować i wyśledź dokładne dane, które próbujesz przeanalizować przed wyjątkiem - w ten sposób możesz debugować, czy dane są poprawne. Prawdopodobnie istnieje błąd w używanym backendie. –

+0

czy zweryfikowałeś swój json? możesz spróbować użyć tego [link] (http://jsonformat.com/), aby zweryfikować swój json –

Odpowiedz

0

Twój wyjątek nie jest pełna. IllegalStateException musi mieć tutaj pewien komentarz. Coś takiego.

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 
Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 

To byłoby bardziej pomocne, jeśli można go zobaczyć w takim formacie Tak, tak błędu, że Container.class() nie jest właściwy typ dla containerJson, spróbuj go naprawić z kodem jak ten

Type collectionType = new TypeToken<Collection<Container>>(){}.getType(); 
Collection<Container> enums = gson.fromJson(containerJson, collectionType);