備忘録 〜プログラミング〜

プログラミングに関する事をつらつらと、、

Gsonでjsonをパースするときに出るExpected begin_array but was begin_objectエラー

サーバー:PHP
フロント:Android
使用ライブラリ:Gson

上記環境で、APIの取得をしたとき、Gsonでパースエラーが出て何とか解決したのでメモしておきます。
PHP側から取得するJSON

{  
   "event":true,
   "data":{  
      "rankings":[  
         {  
            "title":"SampleTitle",
            "image_url":"sample.jpg",
            "prefix":{  
               "latest":true
            }
         },
         {  
            "title":SampleTitle2",
            "image_url":"sample2.jpg",
            "prefix":[  

            ]
         }
      ]
   }
}

Android側でGsonを使用してパースするクラス

public class Sample implements Serializable {
  private static final long serialVersionUID = 1524843151923538548L;
  private Data data;
  public Data getData(){
    return data;
  }
  public void setData(Data data){
    this.data = data;
  }
	
  public class Data{
    private List<Ranking> rankings;
    public List<Ranking> getRankings() {
      return rankings;
    }
    public void setRankings(List<Ranking> rankings) {
      this.rankings = rankings;
    }
  }

  public class Ranking{
    private String title;
    @SerializedName("image_url")
    private String url;
    private Prefix prefix;
    public String getTitle() {
      return title;
    }
    public void setTitle(String title) {
      this.title = title;
    }
    public String getUrl() {
      return url;
    }
    public void setUrl(String url) {
      this.url = url;
    }
    public Prefix getPrefix() {
      return prefix;
    }
    public void setPrefix(Prefix prefix) {
      this.prefix = prefix;
    }
  }

  public class Prefix{
    private boolean monopoly;
    private boolean latest;
    public void setMonopoly(boolean monopoly) {
      this.monopoly = monopoly;
    }
    public boolean getMonopoly(){
      return monopoly;
    }
    public void setLatest(boolean latest) {
      this.latest = latest;
    }
    public boolean getLatest(){
      return latest;
    }
  }
}

上記のものをgsonでパース(com.android.volley.NetworkResponse使用)

private final Gson gson = new Gson();
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
  try {
    String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
    Sample result = gson.fromJson(json, Sample.class);
    return  Response.success(gson.fromJson(json, Sample.class
), enforceClientCaching(HttpHeaderParser.parseCacheHeaders(response), response));
  } catch (UnsupportedEncodingException e) {
    return Response.error(new ParseError(e));
  } catch (JsonSyntaxException e) {
    return Response.error(new ParseError(e));
  }
}

このときに、PHP側からのPrefixがArray型のときと、Object型のときがありハマってしまいました。
PHP側を修正すればいいのですが、修正は出来ないという制約もあったので、他のライブラリが使用出来るのか色々調べていたのですが、
Prefixの部分をこうする事で出来ましたー

private Object prefix;
public Object getPrefix() {
  return prefix;
}
public void setPrefix(Object prefix) {
  this.prefix = prefix;
}

キャストする必要は出てきますが、これで一旦大丈夫かなと。
他に良い方法があれば、良いのですが、、