サーバー: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; }
キャストする必要は出てきますが、これで一旦大丈夫かなと。
他に良い方法があれば、良いのですが、、