【发布时间】:2021-01-26 21:31:37
【问题描述】:
我有问题。我正在做一个网络电话,我在屏幕上打印一个 json,如下所示:
{"Agents":[{"Id":"1","Owner":"Andre"},{"Id":"7","Owner":"Andre2"},{"Id":"8","Owner":"Andre"},{"Id":"9","Owner":"Alexander"},{"Id":"10","Owner":"Alexander"},{"Id":"12","Owner":"Andre"}]}
然后我使用下面的代码从网上获取json并解析成一个数组对象:
EfyWebAPI webAPI = new EfyWebAPI();
String jsonResponse = webAPI.executeQuery("www.mysite.org/test.php", "SELECT Id, Owner FROM Agents");
Gson gson = new Gson();
Agent[] agents = gson.fromJson(jsonResponse, Agent[].class);
System.out.println(agents[0].getId());
类如下所示:
public class Agent {
private int id;
private String owner;
public Agent(int id, String owner) {
this.id = id;
this.owner = owner;
}
public int getId() {
return this.id;
}
}
但是当我运行代码时,我得到以下错误:
线程“主”com.google.gson.JsonSyntaxException 中的异常: java.lang.IllegalStateException:应为 BEGIN_ARRAY 但为 STRING 在第 1 行第 1 列路径 $ 在 com.google.gson.Gson.fromJson(Gson.java:822) 在 com.google.gson.Gson.fromJson(Gson.java:775) 在 com.google.gson.Gson.fromJson(Gson.java:724) 在 com.google.gson.Gson.fromJson(Gson.java:696) 在 com.company.Main.main(Main.java:18) 原因: java.lang.IllegalStateException:应为 BEGIN_ARRAY 但为 STRING 在第 1 行第 1 列路径 $ 在 com.google.gson.stream.JsonReader.beginArray(JsonReader.java:350) 在 com.google.gson.internal.bind.ArrayTypeAdapter.read(ArrayTypeAdapter.java:70) 在 com.google.gson.Gson.fromJson(Gson.java:810) ... 4 更多
为什么会发生这种情况,我该如何解决?
【问题讨论】:
-
另外,1) 确保你的服务器响应是一个真正的 JSON 数组; 2)
Agent字段名不会映射JSON字段:使用@SerializedName映射id到Id等 -
你有一个大小写问题(类有小写成员,JSON 有大写)。我没有看到
com.google.gson.JsonSyntaxException,所以我怀疑代码得到的字符串与您在问题中发布的字符串不同。 -
此错误
Expected ... but was STRING通常发生在响应不是 JSON 文档,而是来自服务器。我强烈建议 OP 仔细检查实际响应并检查它是否完全是 JSON(将响应打印到 stdout 比在此处发布问题要容易得多)。例如,这段代码也会产生相同的错误:gson.fromJson("Error!", Agent[].class)。 -
用多个对象解析 JSON 仍然没有运气!?有什么建议吗?