2017-07-26 4 views
1

im travaillant sur une application Android, qui devrait analyser les horaires de base des transports publics. La partie de base fonctionne très bien, mais j'ai eu un problème avec une liste JSON.Application Android: Gson s'est écrasé lors de la lecture Liste

Le respone JSON ressemble à ceci

{"Departures": [{ 
    "Id": "68496628", 
    "LineName": "15", 
    "Direction": "Munic", 
    "Platform": { 
    "Name": "4", 
    "Type": "Platform" 
    }, 
    "Mot": "Tram", 
    "RealTime": "\/Date(1501101000000+0200)\/", 
    "ScheduledTime": "\/Date(1501101000000+0200)\/", 
    "State": "InTime", 
    "RouteChanges": [ 
    "510322", 
    "510447", 
    "510448" 
    ], 
    "Diva": { 
    "Number": "11015", 
    "Network": "ooe" 
    }]} 

Mon problème est d'analyser la Liste RouteChanges. Parfois, dans la réponse, la liste est vide, parfois c'est une liste comme celle-ci. Mon code pour obtenir la liste dans Android ressemble à ceci:

public static class Cast { 

    private String name="0"; 

    public String getName() { 
     Log.d("Model","String from first List-Entry is: "+name); 
     return name; 
    } 


} 

Mais dans tous les cas quand je reçois une ligne avec une RouteChanges liste mon application est écrasé par le suivant Log-Mon-Message:

07-26 22:09:00.628 9578-17541/com.hisham.jsonparsingdemo E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2 
                     Process: com.hisham.jsonparsingdemo, PID: 9578 
                     java.lang.RuntimeException: An error occurred while executing doInBackground() 
                      at android.os.AsyncTask$3.done(AsyncTask.java:309) 
                      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
                      at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
                      at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
                      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                      at java.lang.Thread.run(Thread.java:818) 
                     Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 237 path $.RouteChanges[0] 
                      at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:200) 
                      at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40) 
                      at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81) 
                      at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60) 
                      at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:103) 
                      at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:196) 
                      at com.google.gson.Gson.fromJson(Gson.java:810) 
                      at com.google.gson.Gson.fromJson(Gson.java:775) 
                      at com.google.gson.Gson.fromJson(Gson.java:724) 
                      at com.google.gson.Gson.fromJson(Gson.java:696) 
                      at com.hisham.jsonparsingdemo.MainActivity$JSONTask.doInBackground(MainActivity.java:149) 
                      at com.hisham.jsonparsingdemo.MainActivity$JSONTask.doInBackground(MainActivity.java:85) 
                      at android.os.AsyncTask$2.call(AsyncTask.java:295) 
                      at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)  
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  
                      at java.lang.Thread.run(Thread.java:818)  
                     Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 237 path $.RouteChanges[0] 
                      at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:387) 
                      at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:189) 
                      at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)  
                      at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81)  
                      at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)  
                      at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:103)  
                      at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:196)  
                      at com.google.gson.Gson.fromJson(Gson.java:810)  
                      at com.google.gson.Gson.fromJson(Gson.java:775)  
                      at com.google.gson.Gson.fromJson(Gson.java:724)  
                      at com.google.gson.Gson.fromJson(Gson.java:696)  
                      at com.hisham.jsonparsingdemo.MainActivity$JSONTask.doInBackground(MainActivity.java:149)  
                      at com.hisham.jsonparsingdemo.MainActivity$JSONTask.doInBackground(MainActivity.java:85)  
                      at android.os.AsyncTask$2.call(AsyncTask.java:295)  
                      at java.util.concurrent.FutureTask.run(FutureTask.java:237)  
                      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)  
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  
                      at java.lang.Thread.run(Thread.java:818)  

la ligne 149 dans mon MainActivity est le Gson-line:

Model movieModel = gson.fromJson(finalObject.toString(), MovieModel.class); // a single line json parsing using Gson 

finalobject a été créé creux:

for(int i=0; i<parentArray.length(); i++) { 
       JSONObject finalObject = parentArray.getJSONObject(i); 

}

Et le parentArray par un tableau JSON, qui divise les chaînes sur le mot-clé « Departures »

Pouvez-vous me aider à lire avec gson dans cette liste?

Merci

Edit: Le MovieModelClass entier:

public class MovieModel { 

@SerializedName("RouteChanges") 
private String LineName; 
private String Direction; 
private String State; 
private String ScheduledTime; 
private String RealTime; 
private String HstOrt; 
private String HstName; 
private String HstId; 

public static class Cast { 

    private String name="0"; 

    public String getName() { 
     return name; 
    } 


} 

public String getLineName(){return LineName;} 
public String getDirection(){return Direction;} 
public String getState(){return State;} 
public String getScheduledTime(){return ScheduledTime;} 
public String getRealTime(){return RealTime;} 
public String getHstOrt(){return HstOrt;} 
public String getHstName(){return HstName;} 
public String getHstId(){return HstId;}} 

Répondre

1

Vous devez mettre une accolade "{" au début:

{ 
"Departures": [{ 
     "Id": "68496628", 
     "LineName": "15", 
     "Direction": "Munic", 
     "Platform": { 
     "Name": "4", 
     "Type": "Platform" 
     }, 
     "Mot": "Tram", 
     "RealTime": "\/Date(1501101000000+0200)\/", 
     "ScheduledTime": "\/Date(1501101000000+0200)\/", 
     "State": "InTime", 
     "RouteChanges": [ 
     "510322", 
     "510447", 
     "510448" 
     ], 
     "Diva": { 
     "Number": "11015", 
     "Network": "ooe" 
     }] 
} 

Ce message est ce qui m'a donné l'idée de votre erreur:

Expected BEGIN_OBJECT but was STRING at line 1

Modifiez cette ligne:

String LineName 

pour cela:

List<String> LineName 
+0

Merci pour votre conseil. J'ai seulement oublié les accolades dans ma Question et l'ai mis à jour. – Hans1357

+0

@ Hans1357 Pouvez-vous ajouter l'intégralité de MovieModel.class? pour voir comment cela correspond à la structure de JSON. –

+0

J'ai ajouté la classe. – Hans1357

0
{ 
"Departures":[ 
    { 
    "Id":"68496628", 
    "LineName":"15", 
    "Direction":"Munic", 
    "Platform":{ 
     "Name":"4", 
     "Type":"Platform" 
    }, 
    "Mot":"Tram", 
    "RealTime":"\/Date(1501101000000+0200)\/", 
    "ScheduledTime":"\/Date(1501101000000+0200)\/", 
    "State":"InTime", 
    "RouteChanges":[ 
     "510322", 
     "510447", 
     "510448" 
    ], 
    "Diva":{ 
     "Number":"11015", 
     "Network":"ooe" 
    } 
    } 
]} 

Encore une accolade fermante } était absent. Vous pouvez toujours tester votre JSON dans Postman ou en ligne JSONformatter