Gson报错信息如下:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $ at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224) at com.google.gson.Gson.fromJson(Gson.java:887) at com.google.gson.Gson.fromJson(Gson.java:852) at com.google.gson.Gson.fromJson(Gson.java:801) at com.telewave.terminal.activity.LoginActivity$4.onSucceed(LoginActivity.java:395) at com.telewave.terminal.http.HttpResponseListener.onSucceed(HttpResponseListener.java:98) at com.yanzhenjie.nohttp.rest.Messenger$Poster.run(Messenger.java:92) at android.os.Handler.handleCallback(Handler.java:761) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:156) at android.app.ActivityThread.main(ActivityThread.java:6523) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832) Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $ at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213) ... 13 more java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $ at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213) at com.google.gson.Gson.fromJson(Gson.java:887) at com.google.gson.Gson.fromJson(Gson.java:852) at com.google.gson.Gson.fromJson(Gson.java:801) at com.telewave.terminal.activity.LoginActivity$4.onSucceed(LoginActivity.java:395) at com.telewave.terminal.http.HttpResponseListener.onSucceed(HttpResponseListener.java:98) at com.yanzhenjie.nohttp.rest.Messenger$Poster.run(Messenger.java:92) at android.os.Handler.handleCallback(Handler.java:761) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:156) at android.app.ActivityThread.main(ActivityThread.java:6523) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
服务器后台获取的Json数据如下:
"[{\"$id\":\"1\",\"systemcode\":\"minalClient\",\"yyname\":\"shuyi\",\"seatno\":\"17002\",\"userid\":\"\",\"username\":\"\",\"ganid\":\"f146bbbf4ba55d680adf0c\",\"nickname\":\"阳光1\",\"status\":3},{\"$id\":\"2\",\"systemcode\":\"minalClient\",\"yyname\":\"anafnf\",\"seatno\":\"20007\",\"userid\":\"\",\"username\":\"\",\"ganid\":\"7f4d2ea93a12d39b4257c7\",\"nickname\":\"青春帅气\",\"status\":3}]"
由于这个数据不规范,导致Json解析出现很多问题,困扰了很久,下面对上面问题说下解决方案
1、实体类如下:
public class MM { private String id; private String systemcode; private String yyname; private String seatno; private String userid; private String username; private String ganid; private String nickname; private int status; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getSystemcode() { return systemcode; } public void setSystemcode(String systemcode) { this.systemcode = systemcode; } public String getYyname() { return yyname; } public void setYyname(String yyname) { this.yyname = yyname; } public String getSeatno() { return seatno; } public void setSeatno(String seatno) { this.seatno = seatno; } public String getUserid() { return userid; } public void setUserid(String userid) { this.userid = userid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getGanid() { return ganid; } public void setGanid(String ganid) { this.ganid = ganid; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } }
然后需要明白的是:在Json中
[ ... ]
代表数组
{ ... } 代表对象
由于该json数据的特殊性,首先得去除
$ 符号,接着还需要去除 \符号
String result1 = result.replaceAll("\\\\", ""); String result2 = result1.replaceAll(Matcher.quoteReplacement("$"), "");
其中result就是该json字符串数据,到这里还有最重要的就是要将首尾引号去掉
String result3 = result2.substring(1, result2.length()-1);
这个时候就可以开心的用GSON对该数据进行解析了,不过要注意用 数组 类型哦
MM[] mmmStr= gson.fromJson(result3, MM[].class); Log.e("onSucceed", "mmmStr:" + Arrays.toString(mmmStr));