2016-09-01 5 views
0

Я пишу клиента REST с помощью RestTemplate и GSON. Ниже приведен пример моего ответа JSONКак получить массив объектов из ответа JSON с помощью GSON

{ 
    "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»

Так что я создал простой POJO, который имеет только name как участник поле.

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: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

Пожалуйста, обратите внимание, что я не хочу, чтобы создать POJO, который имеет точно такую ​​же структуру, как мой объект JSON, потому что Я хочу получить только один атрибут из моего объекта JSON. Я надеюсь, что мне не придется создавать POJO с той же структурой, что и мой ответ JSON, потому что на самом деле это огромный ответ, и я не контролирую его, поэтому он также может меняться завтра.

+1

SyntaxError: Неожиданный токен} в JSON в позиции 170 – Sumit

+1

Ваш JSON - это объект и ** не ** массив. Ну есть свойство * value *, которое имеет массив типов, но также содержит объекты. –

+0

Проблема с JSON в скобке перед «именем». – grajsek

ответ

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.

0

Вы можете попробовать это:

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

Пробовал ваш первый фрагмент кода, такая же ошибка все еще ... И я уже использую второй фрагмент, где я получаю выше ошибки. –

+0

привет @sunnyarya. пожалуйста, проверьте http://stackoverflow.com/questions/20835536/expected-begin-array-but-was-begin-object-at-line-1-column-2-error-when-try#20836018, что у вас такая же проблема. Вам нужно получить только указанные вспомогательные элементы, чтобы вы могли читать из массива и при необходимости создавать подкласс. –

Смежные вопросы