2013-08-20 3 views
1

Ищет ответ, но смог найти тот, который мне помогает. Im использованием залп - запрос JSON им получать сообщение об ошибке: java.lang.IllegalStateException: Ожидаемая BEGIN_OBJECT но BEGIN_ARRAYParsing json file with gson дать ошибку

Это мой код:

public static JsonTask<GameStatusResponse> PostLiveGames(final Context ctx, ArrayList<GameStatus> liveGames) 
{ 
    ArrayList<Integer> gamesIds = new ArrayList<Integer>(); 
    for (GameStatus gameStatus : liveGames) 
    { 
     gamesIds.add(gameStatus.ID); 
    } 

    JsonObject bodObj = new JsonObject(); 
    bodObj.addProperty("AcceptNotification", true); 
    bodObj.addProperty("AppVersion", WZApp.getAppVersion(mContext)); 
    String ids = ""; 
    for (int i = 0; i < gamesIds.size(); i++) 
    { 
     ids = ids + "," + gamesIds.get(i); 
    } 

    ids = ids.substring(1, ids.length()); 

    bodObj.addProperty("games", "[" + ids + "]"); 
    System.out.println("live games object: " + bodObj.toString()); 

    JsonTask<GameStatusResponse> task = new JsonTask<GameStatusResponse>(getURL(APIMethods.GetLiveGames.url), 
      GameStatusResponse.class, new JsonResponseCallback<GameStatusResponse>() 
      { 

       @Override 
       public void onResponseReceived(GameStatusResponse response) 
       { 
        if (response != null && response.response != null 
          && response.response.GameStatusGames.size() > 0) 
         System.out.println("check " + response.response.GameStatusGames.get(0).GameStatusType); 
       } 

       @Override 
       public void onErrorReceived(Exception error) 
       { 
        System.out.println("we got error in live games: " + error.getMessage()); 

       } 
      }); 
    task.addCustomDeserializer(betStatusTypeDeserializer, DataEnums.BetStatusType.class) 
      .addCustomDeserializer(betResultTypeDeserializer, BetResult.class) 
      .addCustomDeserializer(gameStatusTypeDeserializer, DataEnums.WZGameStatusType.class) 
      .addCustomDeserializer(jinxTypeDeserializer, DataEnums.JinxType.class) 
      .addCustomDeserializer(betOddsOutcomesTypeDeserializer, DataEnums.WZOddsOut.class) 
      .addCustomDeserializer(betOddsTypeDeserializer, DataEnums.WZOdds.class); 

    task.setAuthHeader(buildAuthHeader(RequestType.Flow, mDataManager.getCurrUser())).setPostMethod(bodObj); 

    if (WZApp.debugMode) 
     task.setDebugMode(true); 

    task.execute(); 

    return task; 

Это мой класс ответа:

public class GameStatusResponse 
{ 
public Meta meta; 
public GameStatusObject response; 

public class GameStatusObject 
{ 
    public ArrayList<GameStatus> GameStatusGames; 
} 
} 

Мой класс:

import java.util.ArrayList; 
    import android.os.Parcel; 
    import android.os.Parcelable; 
    import com.j256.ormlite.field.DataType; 
    import com.j256.ormlite.field.DatabaseField; 
    import com.j256.ormlite.table.DatabaseTable; 
    import com.moblin.wagerzone.DataEnums; 
    @DatabaseTable 
    public class GameStatus implements Parcelable 
    { 
@DatabaseField 
public int ID; 

@DatabaseField 
public int T1_Result; 

@DatabaseField 
public int T2_Result; 

@DatabaseField 
public int TotalBets; 

@DatabaseField 
public boolean isEnded; 

@DatabaseField 
public int WinnerID; 

@DatabaseField 
public int GameResult; 

@DatabaseField 
public DataEnums.WZGameStatusType GameStatusType; 

@DatabaseField(dataType = DataType.SERIALIZABLE, canBeNull = true) 
public ArrayList<Odd> Odds; 

public int priority; 

public GameStatus() 
{ 
} 

public GameStatus(Parcel in) 
{ 
    this.GameResult = in.readInt(); 
    this.WinnerID = in.readInt(); 
    this.TotalBets = in.readInt(); 
    this.ID = in.readInt(); 
    this.T1_Result = in.readInt(); 
    this.T2_Result = in.readInt(); 
    this.GameStatusType = DataEnums.WZGameStatusType.getById(in.readInt()); 
    boolean[] temp = new boolean[1]; 
    try 
    { 
     in.readBooleanArray(temp); 
    } catch (Exception e) 
    { 
     // TODO: handle exception 
    } 

    isEnded = temp[0]; 
    if (Odds != null) 
     in.readTypedList(Odds, Odd.CREATOR); 
} 

@Override 
public int describeContents() 
{ 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) 
{ 
    dest.writeTypedList(Odds); 
    dest.writeInt(this.WinnerID); 
    dest.writeInt(this.GameResult); 
    if (GameStatusType != null) 
     dest.writeInt(this.GameStatusType.id); 

    dest.writeInt(this.TotalBets); 

    dest.writeInt(this.ID); 

    dest.writeInt(this.T1_Result); 
    dest.writeInt(this.T2_Result); 
    dest.writeBooleanArray(new boolean[] { isEnded }); 

} 

@SuppressWarnings("rawtypes") 
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() 
{ 
    public GameStatus createFromParcel(Parcel in) 
    { 
     return new GameStatus(in); 
    } 

    public GameStatus[] newArray(int size) 
    { 
     return new GameStatus[size]; 
    } 
}; 

public boolean isLive(GameStatus gameStatus) 
{ 
    boolean retval = false; 
    switch (gameStatus.GameStatusType) 
    { 
     case WZGameStatusCancelled: 
      break; 
     case WZGameStatusEnded: 
      break; 
     case WZGameStatusLive: 
      retval = true; 
      break; 
     case WZGameStatusNew: 
      break; 
     case WZGameStatusWaiting: 
      break; 
     default: 
      break; 

    } 
    return retval; 
} 

}

и войти кошка:

08-20 10:28:04.485: I/System.out(26524): we got error in live games: Error parsing JSON: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 96 

здесь также является JSON от сервера:

response: 
{ 
    meta =  { 
     message = OK; 
     "operation_message" = "<null>"; 
     operationstatus = 0; 
     status = 200; 
    }; 
    response =  (
       { 
      GameResult = 3; 
      GameStatusType = 3; 
      ID = 106448; 
      Odds =    (
           { 
        OddID = 84001; 
        Outcomes =      (
               { 
          ID = 4; 
          Name = 1; 
         }, 
               { 
          ID = 5; 
          Name = X; 
         }, 
               { 
          ID = 6; 
          Name = 2; 
         } 
        ); 
        Result = "<null>"; 
        TypeID = 10; 
        TypeName = ThreeWay; 
        Value = "<null>"; 
       } 
      ); 
      "T1_Result" = 0; 
      "T2_Result" = 0; 
      TotalBets = 76; 
      WinnerID = "<null>"; 
      isEnded = 0; 
     }, 
       { 
      GameResult = 3; 
      GameStatusType = 3; 
      ID = 107009; 
      Odds =    (
           { 
        OddID = 85377; 
        Outcomes =      (
               { 
          ID = 7; 
          Name = 1; 
         }, 
               { 
          ID = 8; 
          Name = 2; 
         } 
        ); 
        Result = "<null>"; 
        TypeID = 20; 
        TypeName = TwoWay; 
        Value = "<null>"; 
       } 
      ); 
      "T1_Result" = 0; 
      "T2_Result" = 0; 
      TotalBets = 0; 
      WinnerID = "<null>"; 
      isEnded = 0; 
     }, 
       { 
      GameResult = 3; 
      GameStatusType = 4; 
      ID = 107087; 
      Odds =    (
           { 
        OddID = 85539; 
        Outcomes =      (
               { 
          ID = 7; 
          Name = 1; 
         }, 
               { 
          ID = 8; 
          Name = 2; 
         } 
        ); 
        Result = "<null>"; 
        TypeID = 20; 
        TypeName = TwoWay; 
        Value = "<null>"; 
       } 
      ); 
      "T1_Result" = 0; 
      "T2_Result" = 0; 
      TotalBets = 0; 
      WinnerID = "<null>"; 
      isEnded = 0; 
     } 
    ); 
} 

Я не могу понять это, пожалуйста, сообщите.

Спасибо!

+0

Убедитесь, что вы вставили JSON правильно, потому что я попробовал его в JSONLint и дал синтаксический анализ. –

+0

Ответ не JSON: строки не всегда цитируются, = вместо:, точки с запятой, ... – Henry

+0

Итак, как мне изменить код ответа? thx henry. – SacreDeveloper

ответ

0

Ваш выход кажется странным. Результат JSON придумал сам?

Как поля, скорее всего, начинаются с () вместо [ ] которые обозначают массив. Кроме того, это даже не кажется действительным JSON вообще.

В JSON один не использует =, но : и поля разделяются ; вместо ,. Например:

{ 
    meta : { 
     message : OK, 
     "operation_message" : "<null>", 
     operationstatus : 0, 
     status : 200, 
    }, 
    response : [{ 
     GameResult : 3, 
     GameStatusType : 3, 
     ID : 106448, 
     Odds : [{ 
      OddID : 84001, 
      Outcomes : [{ 
       ID : 4, 
       Name : 1 
      }, { 
       ID : 5, 
       Name : X 
      }, { 
       ID : 6, 
       Name : 2 
      }], 
      Result : "<null>", 
      TypeID : 10, 
      TypeName : ThreeWay, 
      Value : "<null>" 
     }], 
     "T1_Result" : 0, 
     "T2_Result" : 0, 
     TotalBets : 76, 
     WinnerID : "<null>", 
     isEnded : 0 
    }, { 
    .... 
+0

Привет, THX для комментариев. Это вывод, который я получаю от сервера, к которому у меня нет доступа. есть ли какие-либо изменения, которые я могу сделать для моего кода, чтобы он работал? – SacreDeveloper

+0

Вы не можете разобрать его с помощью JSON-библиотек. В худшем случае, если вы не найдете синтаксический анализатор для этого формата (т. Е. Если это проприетарный формат), вам придется написать свой собственный парсер (** не ** с помощью Regex, но написание собственного Tokenizer, который будет следовать правилам этого формата и проанализировать его во что-то, что вы можете использовать) – Tseng

+0

Хорошо, спасибо. я попробую это. – SacreDeveloper