2017-09-25 180 views
2

我試圖解析JSON對象,但我不斷收到錯誤GSON預計Begin_object但名稱JSON

Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NAME at line 1 column 3 path $. 
                       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:187) 
                       at com.google.gson.Gson.fromJson(Gson.java:805) 
                       at com.example.alcanzer.dotastats.HeroDetActivity$MyRanks.doInBackground(HeroDetActivity.java:83) 
                       at com.example.alcanzer.dotastats.HeroDetActivity$MyRanks.doInBackground(HeroDetActivity.java:70) 
                       at android.os.AsyncTask$2.call(AsyncTask.java:292) 
                       at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                       at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)  
                       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  
                       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  
                       at java.lang.Thread.run(Thread.java:818)  
                      Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NAME at line 1 column 3 path $. 
                       at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:387) 
                       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176 

JSON對象是

{"hero_id":1,"rankings":[{"account_id":168340162,"score":480.772994325575,"personaname":"period","name":"tmt","avatar":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/d1/d108bc7c584279b3bfd6147638145b596b5a3649.jpg","last_login":"2017-05-28T18:49:16.421Z","solo_competitive_rank":8883},{"account_id":122049498,"score":457.296281991582,"personaname":"Mike Ross","name":null,"avatar":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/74/745695c8d79c0967ce5cbb63aab90174d0ff427b.jpg","last_login":"2017-08-05T21:55:15.653Z","solo_competitive_rank":7124},{"account_id":178032556,"score":403.130664542372,"personaname":"Never","name":null,"avatar":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/1b/1b07713e510b7c5ca75c0b9b45a6e44182e64e0c.jpg","last_login":"2016-10-26T17:51:51.451Z","solo_competitive_rank":8067},{"account_id":113995822,"score":372.559981235015,"personaname":"iLTW","name":"iLTW","avatar":"https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/9a/9a2a4e758879c0a8851839f0385028c9cef6ac70.jpg","last_login":"2017-01-20T17:11:50.488Z","solo_competitive_rank":8890}]} 

製造它短,但JSON已驗證。我檢查了多個網站。

我的類是

public class Rankings { 
int hero_id; 
Ranks[] rankses = null; 

public int getHero_id() { 
    return hero_id; 
} 

public Ranks[] getRankses() { 
    return rankses; 
}} 
public class Ranks { 
    @SerializedName("account_id") 
    int account_id; 
@SerializedName("score") 
    float score; 
@SerializedName("personaname") 
    String personaname; 
@SerializedName("name") 
    String name; 
@SerializedName("avatar") 
    String avatar; 
@SerializedName("last_login") 
    String last_login; 
@SerializedName("solo_competitive_rank") 
    int solo_competitive_rank; 

public int getAccount_id() { 
    return account_id; 
} 

public float getScore() { 
    return score; 
} 

public String getPersonaname() { 
    return personaname; 
} 

public String getName() { 
    return name; 
} 

public String getAvatar() { 
    return avatar; 
} 

public String getLast_login() { 
    return last_login; 
} 

public int getSolo_competitive_rank() { 
    return solo_competitive_rank; 
}} 

的代碼塊中即時閱讀的JSON是

JsonReader reader = new JsonReader(new InputStreamReader(conn.getInputStream())); 
      /*JsonParser parser = new JsonParser(); 
      JsonObject obj = parser.parse(reader).getAsJsonObject(); 
      rank = gson.fromJson(obj.get("rankings"), Ranks[].class);*/ 
      reader.beginObject(); 
      rank = gson.fromJson(reader, Rankings.class); 
      reader.endObject(); 
      reader.close(); 

我這樣做,當我從reader.beginObject註釋掉的代碼reader.endObject得到所需要的東西並取消評論部分的評論。

但我想知道爲什麼被造成的錯誤。我在某個地方犯了錯嗎?

回答

0

你好,你嘗試使用註釋來定義排名類嗎?事情是這樣的:

public class Ranking{ 
    @SerializedNme("hero_id") 
    private int hero_id; 

    @SerialixedName("ranking") 
    private Ranks[] ranks; 
} 
0

,你需要做到以下幾點:

reader.beginObject(); 
      while (reader.hasNext()) { 

       String name = reader.nextName(); 
       if (name.equals("rankings")) { 

        reader.beginArray(); 

        while (reader.hasNext()) { 

         Ranks yourModelledObject = gson.fromJson(reader, Ranks.class); 
         //do your thing 
        } 

        reader.endArray(); 

       } else 
        reader.skipValue(); 

      } 

      reader.endObject(); 
      reader.close(); 

希望這有助於它爲我工作!

相關問題