2017-07-12 84 views
0

我有一個安靜的端點,它在端點http://127.0.0.1:4567/suppliers上執行GET時提供下面的JSON。使用gson解析json數組中的對象

{ 
    "status": "SUCCESS", 
    "jsonapi": { 
     "version": "1.0" 
    }, 
    "data": { 
     "id": 0, 
     "type": "suppliers", 
     "name": "Red Network Energy LTD" 
    } 
} 

在我使用GSON上述數據解析到SupplierResponseTest對象httpPost請求。當執行:

SupplierResponseTest supplierResponse = gson.fromJson(supplierJsonResponse, SupplierResponseTest.class);

我得到的錯誤:

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 57 path $.data

public SupplierResponseTest sendPostRequest(String supplierName){ 


    SupplierResponseTest supplierResponse; 


    try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) { 


     //Create new object 
     SupplierTest supplier = new SupplierTest(supplierName); 

     //convert to Json 
     Gson gson = new Gson(); 
     String requestBody = gson.toJson(supplier); 


     //set entity 

     HttpPost request = new HttpPost("http://127.0.0.1:4567/suppliers"); 
     StringEntity params = new StringEntity(requestBody); 
     request.addHeader("content-type", "application/json"); 
     request.setEntity(params); 
     HttpResponse result = httpClient.execute(request); 
     String supplierJsonResponse = EntityUtils.toString(result.getEntity(), "UTF-8"); 


     supplierResponse = gson.fromJson(supplierJsonResponse, SupplierResponseTest.class); 

     return supplierResponse; 








    } catch (Exception e) { 
     String status = ""; 
     System.out.println(e.getMessage()); 
     System.out.println(e.getClass()); 
     System.out.println(e.getStackTrace()); 

     status = "NOK"; 

    } 
    //return status; 
    return null; 

} 

對象是如下。

package json.responses; 
import com.google.gson.Gson; 

public class SupplierResponseTest { 

    private StatusResponseTest status; 
    private ApiVersionResponseTest jsonapi; 
    private String message; 
    private ResponseDataTest data; 


    public SupplierResponseTest(StatusResponseTest status, ApiVersionResponseTest jsonapi) { 
     this.status = status; 
     this.jsonapi = jsonapi; 

    } 
    public SupplierResponseTest(StatusResponseTest status, ApiVersionResponseTest jsonapi, String data, String message) { 
     this.status = status; 
     this.jsonapi = jsonapi; 
     this.message = message; 

     //data which needs to take into account the array of suppliers 
     try{ 
      Gson gson = new Gson(); 
      this.data = gson.fromJson(data, ResponseDataTest.class); 


     }catch(Exception e){ 
      System.out.println(e.getMessage()); 
     } 
    } 

    public StatusResponseTest getStatus() { 
     return status; 
    } 
    public ApiVersionResponseTest getJsonapi() { 
     return jsonapi; 
    } 
    public String getMessage() { 
     return message; 
    } 

    //getData which needs to take into account the array of suppliers 
    public ResponseDataTest getData() { 
     return data; 
    } 

} 
+0

您需要爲您創建自定義'JsonDeserializer'Json字符串,此鏈接可能有所幫助(http://www.programcreek.com/java-api-examples/index.php?api=com.google.gson。 JsonDeserializer)在你Json的'數據'是一個數組,但在你的課'ResponseDataTest數據'是一個對象在JSON條款 –

+0

我試圖將所有對'數據'的引用轉換爲數組,但然後我得到一個相同的錯誤 – TheMightyLlama

回答

0

在你的類 - SupplierResponseTest.java

更換private ResponseDataTest data;private ResponseDataTest[] data;

private String status;

在你的JSON響應 '數據' 取代private StatusResponseTest status;包含JSONArray

看看這個代碼 -

package com.stack.example; 

import com.google.gson.Gson; 

public class SupplierResponseTest { 

    private String status; 
    private ApiVersionResponseTest jsonapi; 
    private String message; 
    private ResponseDataTest[] data; 


    public SupplierResponseTest(String status, ApiVersionResponseTest jsonapi) { 
     this.status = status; 
     this.jsonapi = jsonapi; 

    } 
    public SupplierResponseTest(String status, ApiVersionResponseTest jsonapi, String data, String message) { 
     this.status = status; 
     this.jsonapi = jsonapi; 
     this.message = message; 

     //data which needs to take into account the array of suppliers 
     try{ 
      Gson gson = new Gson(); 
      this.data = gson.fromJson(data, ResponseDataTest[].class); 


     }catch(Exception e){ 
      System.out.println(e.getMessage()); 
     } 
    } 

    public String getStatus() { 
     return status; 
    } 
    public ApiVersionResponseTest getJsonapi() { 
     return jsonapi; 
    } 
    public String getMessage() { 
     return message; 
    } 

    //getData which needs to take into account the array of suppliers 
    public ResponseDataTest[] getData() { 
     return data; 
    } 

    @Override 
    public String toString() { 
     return "SupplierResponseTest [status=" + status + ", jsonapi=" 
      + jsonapi + ", message=" + message + ", data=" + data + "]"; 
    } 
} 

public class ApiVersionResponseTest { 

    private String version; 

    public ApiVersionResponseTest() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    public ApiVersionResponseTest(String version) { 
     super(); 
     this.version = version; 
    } 

    public String getVersion() { 
     return version; 
    } 

    public void setVersion(String version) { 
     this.version = version; 
    } 
} 

package com.stack.example; 

public class ResponseDataTest { 

    private int id; 
    private String type; 
    private String name; 
    public ResponseDataTest() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 
    public ResponseDataTest(int id, String type, String name) { 
     super(); 
     this.id = id; 
     this.type = type; 
     this.name = name; 
    } 
    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getType() { 
     return type; 
    } 
    public void setType(String type) { 
     this.type = type; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
} 

package com.stack.example; 

import com.google.gson.Gson; 

public class Stack { 


    public static void main(String[] args) { 

     String jsonResponse = "{\"status\": \"SUCCESS\",\"jsonapi\": {\"version\": \"1.0\"},\"data\": [" 
       + "{\"id\": 70,\"type\": \"suppliers\",\"name\": \"Blue Network Energy LTD\"}," 
       + "{\"id\": 71,\"type\": \"suppliers\",\"name\": \"Red Network Energy LTD\"}," 
       + "{\"id\": 72,\"type\": \"suppliers\",\"name\": \"Orange Network Energy LTD\"}," 
       + "{\"id\": 73,\"type\": \"suppliers\",\"name\": \"Green Network Energy LTD\"}]}"; 

     Gson gson = new Gson(); 

     //Parse json into a SupplierResponseTest object. 
     SupplierResponseTest supplierResponse = gson.fromJson(jsonResponse, SupplierResponseTest.class); 

     System.out.println(supplierResponse); 

    } 

} 

希望這會對你有用。

+0

不幸的是,我得到了同樣的錯誤: – TheMightyLlama

+0

錯誤仍在繼續... – TheMightyLlama

+0

@TheMightyLlama我認爲你錯過了一些東西看看我在我的答案中添加的代碼,它的工作正常。 –