2017-09-25 93 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(); 

希望这有助于它为我工作!

相关问题