我正在使用RestTemplate和GSON编写REST客户端。 以下是我的JSON响应示例
{
"value": [
{
"properties": {
"vmId": "f7f953fb-d853-4373-b564-",
"hardwareProfile": {
"vmSize": "Standard_D2"
},
},
"name": "A",
"Id": ""
},
{
"properties": {
"vmId": "f7f953fb-d853-4373-b564-",
"hardwareProfile": {
"vmSize": "Standard_D2"
},
},
"name": "B",
"Id": ""
},
{
"properties": {
"vmId": "f7f953fb-d853-4373-b564-",
"hardwareProfile": {
"vmSize": "Standard_D2"
},
},
"name": "C",
"Id": ""
}
]
}
我想要的是我只想获得属性的值 - > “name
”
所以我创建了一个只有name
作为成员字段的简单POJO。
public class VMNames {
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
我试图像这样使用GSON来获取这个POJO的数组。这里,响应是我的JSON响应对象。
Gson gson = new Gson();
VMNames[] vmNamesArray = gson.fromJson(response.getBody(), VMNames[].class);
System.out.println(vmNamesArray.length);
但是当我这样做时,我收到一个错误,如下所示:
java.lang.IllegalStateException:预期为BEGIN_ARRAY但在第1行第2行路径为BEGIN_OBJECT $
请注意,我不想创建一个与我的JSON对象具有完全相同结构的POJO,因为我只想从我的JSON对象中获取一个属性。我希望我不必真正创建一个与我的JSON响应具有相同结构的POJO,因为实际上它是一个巨大的响应,我不控制它,所以明天也可以改变。
答案 0 :(得分:2)
你可以试试这个:
public class VMNames {
@SerializedName("name")
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Type collectionType = new TypeToken<Collection<VMNames>>(){}.getType();
Collection<VMNames> vmNamesArray = gson.fromJson(response.getBody(), collectionType);
System.out.println(vmNamesArray.length);
或尝试:
VMNames[] vmNamesArray = gson.fromJson(response.getBody(), VMNames[].class);
答案 1 :(得分:0)
所以我可以完成这件事。发布答案,以便有人明天受益:)
首先,我停止使用GSON并开始使用JSON。 以下是帮助的代码。
RestTemplate restTemplate = new RestTemplate();
response = (ResponseEntity<String>) restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
JSONObject jsonObj = new JSONObject(response.getBody().toString());
JSONArray c = jsonObj.getJSONArray("value");
for (int i = 0; i < c.length(); i++) {
JSONObject obj = c.getJSONObject(i);
String VMName = obj.getString("name");
VMNames vmnames = new VMNames();
vmnames.setName(VMName);
vmNames.add(vmnames);
}
return vmNames;
我得到一个json数组形式的属性名称的所有值的列表。