簡體   English   中英

如何使用GSON從JSON響應中獲取對象數組

[英]How to get array of objects from JSON response using 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,因為實際上,這是一個巨大的響應,並且我無法控制它,因此它明天也可以更改。

你可以嘗試一下:

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);

這樣我就可以完成。 發布答案,以便明天有人可以受益:)

首先,我停止使用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數組的形式獲取了針對屬性名稱的所有值的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM