2017-10-15 1 views
0

Je reçois un résultat json du service avec retrofit comme ci-dessous:Rénovation - Vous attendiez BEGIN_ARRAY mais BEGIN_OBJECT?

{ 
    "result": { 
     "totalCount": 15, 
     "resultCount": 2, 
     "offset": 0, 
     "limit": 2, 
     "products": [ 
      { 
       "id": 10081, 
       "name": "prod", 
       "pictureUrl": "url", 
       "price": 1, 
       "url": "url", 
       "briefDescription": "test", 
       "description": "test", 
       "pictures": [], 
       "categoryTitle": "s s", 
       "categoryId": 53, 
       "extraInfo": { 
        "productProperties": [ 
         { 
          "id": 88, 
          "value": "6", 
          "measurementUnit": "s", 
          "title": "s" 
         }, 
         { 
          "id": 89, 
          "value": "2", 
          "measurementUnit": "s", 
          "title": "s s" 
         }, 
         { 
          "id": 90, 
          "value": "2", 
          "measurementUnit": "s", 
          "title": "s s s s" 
         }, 
         { 
          "id": 91, 
          "value": "", 
          "measurementUnit": "", 
          "title": "s s" 
         }, 
         { 
          "id": 92, 
          "value": "", 
          "measurementUnit": "", 
          "title": "s s" 
         }, 
         { 
          "id": 93, 
          "value": "", 
          "measurementUnit": "", 
          "title": "s" 
         }, 
         { 
          "id": 94, 
          "value": "", 
          "measurementUnit": "", 
          "title": "s" 
         } 
        ], 
        "published": false, 
        "preparationTime": 1, 
        "keywords": "", 
        "quantity": 0, 
        "status": 1 
       } 
      }, 
      { 
       "id": 51, 
       "name": "nam3", 
       "pictureUrl": "url", 
       "price": 495000, 
       "url": "url", 
       "briefDescription": "sdsds", 
       "description": "-", 
       "pictures": [], 
       "categoryTitle": "x x x", 
       "categoryId": 179, 
       "extraInfo": { 
        "productProperties": [ 
         { 
          "id": 67, 
          "value": "1000", 
          "measurementUnit": "x", 
          "title": "x x" 
         }, 
         { 
          "id": 68, 
          "value": "1050", 
          "measurementUnit": "s", 
          "title": "x x x" 
         }, 
         { 
          "id": 69, 
          "value": "", 
          "measurementUnit": "", 
          "title": "x x" 
         }, 
         { 
          "id": 70, 
          "value": "", 
          "measurementUnit": "", 
          "title": "x x" 
         }, 
         { 
          "id": 71, 
          "value": "", 
          "measurementUnit": "", 
          "title": "xxxx" 
         } 
        ], 
        "published": true, 
        "preparationTime": 2, 
        "keywords": "Aswddfe", 
        "quantity": 93, 
        "status": 1 
       } 
      } 
     ] 
    } 
} 

Et je reçois comme ci-dessous avec retrofit:

RetrofitApi.getVendorAdminApi() 
     .getAdminProductss(userToken, limit, pageNumber, filters) 
     .enqueue(new Callback<List<ProductsModel>>() { 
      @Override 
      public void onResponse(Call<List<ProductsModel>> call, Response<List<ProductsModel>> response) { 
       if (response.isSuccessful()) { 
        resultListener.onSuccess(response.body()); 
       } else { 
        resultListener.onFailure(); 
       } 
      } 

      @Override 
      public void onFailure(Call<List<ProductsModel>> call, Throwable t) { 
       resultListener.onFailure(); 
       t.printStackTrace(); 
      } 
     }); 

Mais me dis:

Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $ 

Et ci-dessous est mon modèle:

public class ProductsModel { 

    @SerializedName("result") 
    @Expose 
    private ResultProducts result; 

    public ResultProducts getResult() { 
     return result; 
    } 

    public void setResult(ResultProducts result) { 
     this.result = result; 
    } 

} 
+0

Pouvez-vous ajouter votre classe de modèle ResultProducts ainsi –

+0

Copiez ci-dessus le modèle dans cette URL (http://www.jsonschema2pojo.org/) et voir le modèle. –

Répondre

1

Votre problème est Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

donc changer List<ProductsModel>-ProductsModel.

  • Si JSON est JSONArray, vous pouvez analyser à List (comme List<ProductsModel>).

  • Si JSON est JSONObject, vous pouvez analyser à Object (comme ProductsModel).

Optez pour cela.

@Override 
public void onResponse(Call<ProductsModel> call, Response<ProductsModel> response) { 
    if (response.isSuccessful()) { 
     resultListener.onSuccess(response.body()); 
    } else { 
     resultListener.onFailure(); 
    } 
} 

Et

Call<ProductsModel> getAdminProductss(); 
0

Changer votre appel Retrofit à:

RetrofitApi.getVendorAdminApi() 
     .getAdminProductss(userToken, limit, pageNumber, filters) 
     .enqueue(new Callback<ProductsModel>() { 
      @Override 
      public void onResponse(Call<ProductsModel> call, Response<ProductsModel> response) { 
       if (response.isSuccessful()) { 
        resultListener.onSuccess(response.body()); 
       } else { 
        resultListener.onFailure(); 
       } 
      } 

      @Override 
      public void onFailure(Call<ProductsModel> call, Throwable t) { 
       resultListener.onFailure(); 
       t.printStackTrace(); 
      } 
     }); 

Le Raison est: si vous mettez List<ProductsModel> il va vérifier JsonArray mais dans votre réponse, il vient JsonObject, donc passer de List<ProductsModel> à ProductsModel va donc lve ton problème.

J'espère que ça aide!

0

Le noeud "résultat" dans les données json est un objet et non un tableau. La classe modèle du JSON sera le suivant

public class ResponseJSON 
{ 
    private Result result; 

    public Result getResult() 
    { 
     return result; 
    } 

    public void setResult (Result result) 
    { 
     this.result = result; 
    } 

    @Override 
    public String toString() 
    { 
     return "ClassPojo [result = "+result+"]"; 
    } 
} 

public class Result 
{ 
    private String limit; 

    private String totalCount; 

    private String resultCount; 

    private String offset; 

    private Products[] products; 

    public String getLimit() 
    { 
     return limit; 
    } 

    public void setLimit (String limit) 
    { 
     this.limit = limit; 
    } 

    public String getTotalCount() 
    { 
     return totalCount; 
    } 

    public void setTotalCount (String totalCount) 
    { 
     this.totalCount = totalCount; 
    } 

    public String getResultCount() 
    { 
     return resultCount; 
    } 

    public void setResultCount (String resultCount) 
    { 
     this.resultCount = resultCount; 
    } 

    public String getOffset() 
    { 
     return offset; 
    } 

    public void setOffset (String offset) 
    { 
     this.offset = offset; 
    } 

    public Products[] getProducts() 
    { 
     return products; 
    } 

    public void setProducts (Products[] products) 
    { 
     this.products = products; 
    } 

    @Override 
    public String toString() 
    { 
     return "ClassPojo [limit = "+limit+", totalCount = "+totalCount+", resultCount = "+resultCount+", offset = "+offset+", products = "+products+"]"; 
    } 
} 

public class ProductProperties 
{ 
    private String id; 

    private String title; 

    private String measurementUnit; 

    private String value; 

    public String getId() 
    { 
     return id; 
    } 

    public void setId (String id) 
    { 
     this.id = id; 
    } 

    public String getTitle() 
    { 
     return title; 
    } 

    public void setTitle (String title) 
    { 
     this.title = title; 
    } 

    public String getMeasurementUnit() 
    { 
     return measurementUnit; 
    } 

    public void setMeasurementUnit (String measurementUnit) 
    { 
     this.measurementUnit = measurementUnit; 
    } 

    public String getValue() 
    { 
     return value; 
    } 

    public void setValue (String value) 
    { 
     this.value = value; 
    } 

    @Override 
    public String toString() 
    { 
     return "ClassPojo [id = "+id+", title = "+title+", measurementUnit = "+measurementUnit+", value = "+value+"]"; 
    } 
} 

public class Products 
{ 
    private String id; 

    private String price; 

    private String categoryTitle; 

    private String briefDescription; 

    private String pictureUrl; 

    private String description; 

    private String categoryId; 

    private String name; 

    private ExtraInfo extraInfo; 

    private String[] pictures; 

    private String url; 

    public String getId() 
    { 
     return id; 
    } 

    public void setId (String id) 
    { 
     this.id = id; 
    } 

    public String getPrice() 
    { 
     return price; 
    } 

    public void setPrice (String price) 
    { 
     this.price = price; 
    } 

    public String getCategoryTitle() 
    { 
     return categoryTitle; 
    } 

    public void setCategoryTitle (String categoryTitle) 
    { 
     this.categoryTitle = categoryTitle; 
    } 

    public String getBriefDescription() 
    { 
     return briefDescription; 
    } 

    public void setBriefDescription (String briefDescription) 
    { 
     this.briefDescription = briefDescription; 
    } 

    public String getPictureUrl() 
    { 
     return pictureUrl; 
    } 

    public void setPictureUrl (String pictureUrl) 
    { 
     this.pictureUrl = pictureUrl; 
    } 

    public String getDescription() 
    { 
     return description; 
    } 

    public void setDescription (String description) 
    { 
     this.description = description; 
    } 

    public String getCategoryId() 
    { 
     return categoryId; 
    } 

    public void setCategoryId (String categoryId) 
    { 
     this.categoryId = categoryId; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public void setName (String name) 
    { 
     this.name = name; 
    } 

    public ExtraInfo getExtraInfo() 
    { 
     return extraInfo; 
    } 

    public void setExtraInfo (ExtraInfo extraInfo) 
    { 
     this.extraInfo = extraInfo; 
    } 

    public String[] getPictures() 
    { 
     return pictures; 
    } 

    public void setPictures (String[] pictures) 
    { 
     this.pictures = pictures; 
    } 

    public String getUrl() 
    { 
     return url; 
    } 

    public void setUrl (String url) 
    { 
     this.url = url; 
    } 

    @Override 
    public String toString() 
    { 
     return "ClassPojo [id = "+id+", price = "+price+", categoryTitle = "+categoryTitle+", briefDescription = "+briefDescription+", pictureUrl = "+pictureUrl+", description = "+description+", categoryId = "+categoryId+", name = "+name+", extraInfo = "+extraInfo+", pictures = "+pictures+", url = "+url+"]"; 
    } 
} 

public class ExtraInfo 
{ 
    private String keywords; 

    private ProductProperties[] productProperties; 

    private String preparationTime; 

    private String status; 

    private String quantity; 

    private String published; 

    public String getKeywords() 
    { 
     return keywords; 
    } 

    public void setKeywords (String keywords) 
    { 
     this.keywords = keywords; 
    } 

    public ProductProperties[] getProductProperties() 
    { 
     return productProperties; 
    } 

    public void setProductProperties (ProductProperties[] productProperties) 
    { 
     this.productProperties = productProperties; 
    } 

    public String getPreparationTime() 
    { 
     return preparationTime; 
    } 

    public void setPreparationTime (String preparationTime) 
    { 
     this.preparationTime = preparationTime; 
    } 

    public String getStatus() 
    { 
     return status; 
    } 

    public void setStatus (String status) 
    { 
     this.status = status; 
    } 

    public String getQuantity() 
    { 
     return quantity; 
    } 

    public void setQuantity (String quantity) 
    { 
     this.quantity = quantity; 
    } 

    public String getPublished() 
    { 
     return published; 
    } 

    public void setPublished (String published) 
    { 
     this.published = published; 
    } 

    @Override 
    public String toString() 
    { 
     return "ClassPojo [keywords = "+keywords+", productProperties = "+productProperties+", preparationTime = "+preparationTime+", status = "+status+", quantity = "+quantity+", published = "+published+"]"; 
    } 
} 

public class ProductProperties 
{ 
    private String id; 

    private String title; 

    private String measurementUnit; 

    private String value; 

    public String getId() 
    { 
     return id; 
    } 

    public void setId (String id) 
    { 
     this.id = id; 
    } 

    public String getTitle() 
    { 
     return title; 
    } 

    public void setTitle (String title) 
    { 
     this.title = title; 
    } 

    public String getMeasurementUnit() 
    { 
     return measurementUnit; 
    } 

    public void setMeasurementUnit (String measurementUnit) 
    { 
     this.measurementUnit = measurementUnit; 
    } 

    public String getValue() 
    { 
     return value; 
    } 

    public void setValue (String value) 
    { 
     this.value = value; 
    } 

    @Override 
    public String toString() 
    { 
     return "ClassPojo [id = "+id+", title = "+title+", measurementUnit = "+measurementUnit+", value = "+value+"]"; 
    } 
} 

Et le dos d'appel sera Callback<ResponseJSON>

Vous pouvez obtenir le résultat produit par reponse.body() getResult() getProducts()..

J'ai généré le modèle de http://pojo.sodhanalibrary.com/. Vous pouvez en créer un autre si vous le souhaitez en vous référant aux modèles que j'ai donnés.

0

En tant que réponse de votre service, vous avez un OBJET avec la clé: "résultat", contient quelques champs et une LISTE DE PRODUIT (tableau, avec clé "produits"). Votre ProductsModel est plutôt bon.Mais votre mise en œuvre pour la modernisation a eu tort, devrait être:

RetrofitApi.getVendorAdminApi() 
     .getAdminProductss(userToken, limit, pageNumber, filters) 
     .enqueue(new Callback<ProductsModel>() { 
      @Override 
      public void onResponse(Call<ProductsModel> call, Response<ProductsModel> response) { 
       if (response.isSuccessful()) { 
        resultListener.onSuccess(response.body()); 
       } else { 
        resultListener.onFailure(); 
       } 
      } 

      @Override 
      public void onFailure(Call<ProductsModel> call, Throwable t) { 
       resultListener.onFailure(); 
       t.printStackTrace(); 
      } 
     }); 

Changements: remplacer tous List<ProductsModel> par ProductsModel.