Reputation:
I am getting a json
result from service with retrofit like bellow :
{
"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
}
}
]
}
}
And I am getting like bellow with 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();
}
});
But say me :
Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
And bellow is my model :
public class ProductsModel {
@SerializedName("result")
@Expose
private ResultProducts result;
public ResultProducts getResult() {
return result;
}
public void setResult(ResultProducts result) {
this.result = result;
}
}
Upvotes: 2
Views: 7279
Reputation: 684
Change your API reply
res
.status(StatusCodes.OK)
.json({ result })
res
.status(StatusCodes.OK)
.json([ ...result ])
Change your retrofit service
@GET("results")
suspend fun getResults(): Response<resultsResponse?>?
@GET("results")
suspend fun getResults(): Response<List<Result>?>?
Upvotes: 0
Reputation: 8237
Your problem is Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
so change
List<ProductsModel>
toProductsModel
.
If JSON
is JSONArray
,you can parse it to List
(like List<ProductsModel>
).
If JSON
is JSONObject
,you can parse it to Object
(like ProductsModel
).
Change to this.
@Override
public void onResponse(Call<ProductsModel> call, Response<ProductsModel> response) {
if (response.isSuccessful()) {
resultListener.onSuccess(response.body());
} else {
resultListener.onFailure();
}
}
And
Call<ProductsModel> getAdminProductss();
Upvotes: 13
Reputation: 1289
As your service's response, you have AN OBJECT with key: "result", contains some fields and a LIST OF PRODUCT (array, with key "products"). Your ProductsModel
is pretty good. But your implementation for retrofit was wrong, should be:
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();
}
});
Changes: replace all List<ProductsModel>
by ProductsModel
.
Upvotes: 0
Reputation: 100
The "result" node in the json data is an object not an array. The model class of the json will be as follows
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+"]";
}
}
And the call back will be Callback<ResponseJSON>
You can get the product result by reponse.body().getResult().getProducts();
I have generated the model from http://pojo.sodhanalibrary.com/. You can create another if you want by referring the models i have given.
Upvotes: 0
Reputation: 4650
Change your Retrofit call to:
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();
}
});
The Reason is: if you put List<ProductsModel>
it will check for JsonArray
but in your response it is coming JsonObject
, hence just changing from List<ProductsModel>
to ProductsModel
will solve your problem.
Hope it helps!
Upvotes: 0