改造 - 预计BEGIN_ARRAY但是BEGIN_OBJECT?

时间:2017-10-15 11:58:30

标签: android retrofit2 gson

我从服务中得到readline结果,如下所述:

json

我和{ "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 } } ] } }

相似
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();
            }
        });

吼叫是我的模特:

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

4 个答案:

答案 0 :(得分:0)

您的问题是Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

  

所以将List<ProductsModel>更改为ProductsModel

  • 如果JSONJSONArray,您可以将其解析为List(例如List<ProductsModel>)。

  • 如果JSONJSONObject,您可以将其解析为Object(例如ProductsModel)。

改为此。

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

并且

Call<ProductsModel> getAdminProductss();

答案 1 :(得分:0)

将您的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();
            }
        });

原因是:如果您添加List<ProductsModel>,它会检查JsonArray,但在您的回复中它将会JsonObject,因此只会从{{更改List<ProductsModel> 1}}到ProductsModel将解决您的问题。

希望它有所帮助!

答案 2 :(得分:0)

&#34;结果&#34; json数据中的节点是一个对象而不是一个数组。 json的模型类如下

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+"]";
    }
}

回拨将是Callback<ResponseJSON>

您可以通过reponse.body()获取产品结果.getResult()。getProducts();

我已经从http://pojo.sodhanalibrary.com/生成了模型。如果您愿意,可以通过参考我给出的模型来创建另一个。

答案 3 :(得分:0)

作为您服务的回复,您有一个带有密钥的对象:&#34;结果&#34;,包含一些字段和产品清单(数组,带有密钥&#34;产品&#34;) 。你的ProductsModel非常好。但是你的改造实施是错误的,应该是:

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

更改:将所有List<ProductsModel>替换为ProductsModel