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;
}
}
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 –
J'ai essayé de convertir toutes les références à 'data' en un tableau, mais j'ai la même erreur – TheMightyLlama