如何使用GSON从JSON响应中获取对象数组

时间:2016-09-01 21:03:30

标签: java gson

我正在使用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,因为实际上它是一个巨大的响应,我不控制它,所以明天也可以改变。

2 个答案:

答案 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数组形式的属性名称的所有值的列表。