Gson 解析时候报错: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

在使用Gson解析JSON时遇到了错误,错误信息提示在行1列2的位置预期是BEGIN_OBJECT,但实际上遇到了BEGIN_ARRAY。问题出在数据前后存在中括号。解决方法是简单地删除这些多余的中括号。


03-17 23:05:00.373 18335-18335/? E/AndroidRuntime: FATAL EXCEPTION: main
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime: Process: tech.androidstudio.jsongsondemo, PID: 18335
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{tech.androidstudio.jsongsondemo/tech.androidstudio.jsongsondemo.MainActivity}: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2314)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2386)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.ActivityThread.access$800(ActivityThread.java:148)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5310)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:  Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at com.google.gson.Gson.fromJson(Gson.java:879)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at com.google.gson.Gson.fromJson(Gson.java:844)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at com.google.gson.Gson.fromJson(Gson.java:793)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at com.google.gson.Gson.fromJson(Gson.java:765)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at tech.androidstudio.jsongsondemo.MainActivity.onCreate(MainActivity.java:54)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.Activity.performCreate(Activity.java:5953)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1128)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2267)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2386) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.ActivityThread.access$800(ActivityThread.java:148) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5310) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:  Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:388)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:209)
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at com.google.gson.Gson.fromJson(Gson.java:879) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at com.google.gson.Gson.fromJson(Gson.java:844) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at com.google.gson.Gson.fromJson(Gson.java:793) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at com.google.gson.Gson.fromJson(Gson.java:765) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at tech.androidstudio.jsongsondemo.MainActivity.onCreate(MainActivity.java:54) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.Activity.performCreate(Activity.java:5953) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1128) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2267) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2386) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.ActivityThread.access$800(ActivityThread.java:148) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5310) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372) 
03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 

03-17 23:05:00.373 18335-18335/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 


原因是数据的前后多了[ ]中括号。

String gsonStr1= "[{name:'name0',age:0}]";

解决办法:

将前后的中括号去掉就好了。

//修改后{name:'name0',age:0},要去掉前后的括号。
String gsonStr1= "{name:'name0',age:0}";


出现 'java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 60 path $.data' 错误,通常是在使用 Gson 等 JSON 解析库时,代码预期解析一个 JSON 对象(BEGIN_OBJECT),但实际遇到的是 JSON 数组(BEGIN_ARRAY)。可参考以下解决方法: ### 与后台沟通 跟后台开发人员沟通,让其返回符合预期的标准 JSON 串。若代码期望的是 JSON 对象,就请后台返回 JSON 对象,而非 JSON 数组。例如原本返回的是 `{ "data": [{"id": 1}, {"id": 2}] }`,期望 `data` 是对象时,应返回 `{ "data": {"id": 1} }` [^1]。 ### 手动处理 JSON 数据 若无法及时与后台沟通,可手动对 JSON 数据进行处理。若 JSON 串前后多了 `[]` 中括号,可使用 `split()` 方法将其去掉。示例代码如下: ```java import com.google.gson.Gson; public class JsonParsingExample { public static void main(String[] args) { String jsonWithBrackets = "[{\"id\":175,\"objectId\":65,\"xz\":\"胜利村\",\"name\":\"赵桂香\",\"mz\":\"汉族\"}]"; // 去掉前后的中括号 String jsonWithoutBrackets = jsonWithBrackets.substring(1, jsonWithBrackets.length() - 1); Gson gson = new Gson(); // 假设这里有一个对应的 Java 类 // YourClass obj = gson.fromJson(jsonWithoutBrackets, YourClass.class); } } ``` ### 调整代码逻辑以处理数组 若返回的 JSON 数组是合理的,可调整代码逻辑来处理数组。示例代码如下: ```java import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.List; class YourClass { private int id; private int objectId; private String xz; private String name; private String mz; // Getters and setters public int getId() { return id; } public void setId(int id) { this.id = id; } public int getObjectId() { return objectId; } public void setObjectId(int objectId) { this.objectId = objectId; } public String getXz() { return xz; } public void setXz(String xz) { this.xz = xz; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMz() { return mz; } public void setMz(String mz) { this.mz = mz; } } public class JsonArrayParsingExample { public static void main(String[] args) { String jsonArray = "[{\"id\":175,\"objectId\":65,\"xz\":\"胜利村\",\"name\":\"赵桂香\",\"mz\":\"汉族\"}]"; Gson gson = new Gson(); Type listType = new TypeToken<List<YourClass>>() {}.getType(); List<YourClass> objList = gson.fromJson(jsonArray, listType); for (YourClass obj : objList) { System.out.println(obj.getName()); } } } ```
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值