我有一个问题。我正在做一个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
和值是一个数组的Agent
s.
一个可能的解决方案可以创建一个类命名为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>
。