2017-07-12 3 views
0

J'ai un point de terminaison reposant qui fournit le JSON ci-dessous lors de l'exécution d'un GET sur le point de terminaison http://127.0.0.1:4567/suppliers.Analyse d'objets dans un tableau json avec gson

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

Dans la demande de HttpPost J'utilise GSON pour analyser les données ci-dessus dans l'objet SupplierResponseTest. Lors de l'exécution:

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

Je reçois l'erreur:

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; 

} 

L'objet est comme ci-dessous.

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

Vous devez créer votre 'JsonDeserializer' personnalisé pour votre chaîne JSON, ce lien peut vous aider (http://www.programcreek.com/java-api-examples/index.php?api=com.google.gson. JsonDeserializer) En vous JSON 'data' est un tableau mais dans votre classe 'ResponseDataTest data' est un objet en termes JSON –

+0

J'ai essayé de convertir toutes les références à 'data' en un tableau, mais j'ai la même erreur – TheMightyLlama

Répondre

0

Dans votre classe - SupplierResponseTest.java

Remplacer private ResponseDataTest data; avec private ResponseDataTest[] data;

et remplacer private StatusResponseTest status; avec private String status;

Comme dans votre réponse JSON 'données' contient JSONArray

Regardez ce code -

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

    } 

} 

Espérons que cela fonctionnera pour vous.

+0

Malheureusement, je reçois la même erreur: – TheMightyLlama

+0

l'erreur continue ... – TheMightyLlama

+0

@TheMightyLlama Je pense qu'il vous manque quelque chose regardez le code que j'ai ajouté dans ma réponse, Il fonctionne très bien. –