Java GSON解析对象数组失败



我有一个问题。我正在做一个webcall,我在屏幕上打印一个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"}]}

然后我使用以下代码从web获取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;
}
}

但是当我运行代码时,我得到以下错误:

线程"main"异常com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:期望的BEGIN_ARRAY,但却是STRING在第1行第1列路径$ Atcom.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列路径$ Atcom.google.gson.stream.JsonReader.beginArray (JsonReader.java: 350)com.google.gson.internal.bind.ArrayTypeAdapter.read (ArrayTypeAdapter.java: 70)gson. gson. fromjson (Gson.java:810)…4个

为什么会发生这种情况,我如何解决这个问题?

错误提示

预期BEGIN_ARRAY…

由于第二个参数(Agent[].class),它期望Agent-s的有效json数组字符串。你的json字符串是一个对象的关键是Agents和值是一个数组的Agents.

一个可能的解决方案可以创建一个类命名为Agents代表json对象。

public class Agents {
private Agent[] Agents; // note the capital 'A' matches the key name in the json string
public Agent[] getAgents() {
return Agents;
}
public void setAgents(Agent[] agents) {
this.Agents = agents;
}
}

并按如下方式调整Agent类:

public class Agent {
@SerializedName("Id") // note the annotated field is needed since in the json string id is Id
private int id;
@SerializedName("Owner") // same as id field, annotation needed, or rename owner to Owner
private String owner;
public Agent(int id, String owner) {
this.id = id;
this.owner = owner;
}
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public void setOwner(String owner) {
this.owner = owner;
}
@Override
public String toString() {
return "Agent{" +
"id=" + id +
", owner='" + owner + ''' +
'}';
}
}

这里是一个工作演示:

public class GsonDemo {
public static void main(String[] args) {
String 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"}]}";
Gson gson = new Gson();
Agents a = gson.fromJson(json, Agents.class);
System.out.println(a.getAgents()[1]);
System.out.println(a.getAgents().length);
// Output:
// Agent{id=7, owner='Andre2'}
// 6
}
}

它有点…它得到的不是id=1,而是id=0。它从json中获取对象计数的id。这是如何工作的,为什么我不能一次解析多个对象并将其返回到数组列表或其他东西?

JSON(或至少GSON)总是期望字符串作为键(据我所知)。字符串后面是什么并不重要,只要它符合JSON标准。

如果你声明了类似

的东西,你所提到的是可能的{"persons" : [+其余内容+]},但我不确定您是否可以自动将其解析为List<Agent>

最新更新