我从API端点获得以下JSON响应。我已经尝试使用GSON来解析JSON,但似乎有一个bug。现在我想看看我是否可以使用Moshi。如何使用Moshi解析以下JSON对象:https://drive.google.com/open?id=1ZJoS5WetAfjMbjU-_YPbW0EPDJSmKpFk。我一直在使用以下POJO:用于产品类
public class ProductsByCategory{
@SerializedName("id")
@Expose
private Integer id;
@SerializedName("name")
@Expose
private String name;
@SerializedName("slug")
@Expose
private String slug;
@SerializedName("permalink")
@Expose
private String permalink;
@SerializedName("date_created")
@Expose
private String dateCreated;
@SerializedName("date_created_gmt")
@Expose
private String dateCreatedGmt;
@SerializedName("date_modified")
@Expose
private String dateModified;
@SerializedName("date_modified_gmt")
@Expose
private String dateModifiedGmt;
@SerializedName("type")
@Expose
private String type;
@SerializedName("status")
@Expose
private String status;
@SerializedName("featured")
@Expose
private Boolean featured;
@SerializedName("catalog_visibility")
@Expose
private String catalogVisibility;
@SerializedName("description")
@Expose
private String description;
@SerializedName("short_description")
@Expose
private String shortDescription;
@SerializedName("sku")
@Expose
private String sku;
@SerializedName("price")
@Expose
private String price;
@SerializedName("regular_price")
@Expose
private String regularPrice;
@SerializedName("sale_price")
@Expose
private String salePrice;
@SerializedName("date_on_sale_from")
@Expose
private Object dateOnSaleFrom;
@SerializedName("date_on_sale_from_gmt")
@Expose
private Object dateOnSaleFromGmt;
@SerializedName("date_on_sale_to")
@Expose
private Object dateOnSaleTo;
@SerializedName("date_on_sale_to_gmt")
@Expose
private Object dateOnSaleToGmt;
@SerializedName("price_html")
@Expose
private String priceHtml;
@SerializedName("on_sale")
@Expose
private Boolean onSale;
@SerializedName("purchasable")
@Expose
private Boolean purchasable;
@SerializedName("total_sales")
@Expose
private Integer totalSales;
@SerializedName("virtual")
@Expose
private Boolean virtual;
@SerializedName("downloadable")
@Expose
private Boolean downloadable;
@SerializedName("downloads")
@Expose
private List<Object> downloads = null;
@SerializedName("download_limit")
@Expose
private Integer downloadLimit;
@SerializedName("download_expiry")
@Expose
private Integer downloadExpiry;
@SerializedName("external_url")
@Expose
private String externalUrl;
@SerializedName("button_text")
@Expose
private String buttonText;
@SerializedName("tax_status")
@Expose
private String taxStatus;
@SerializedName("tax_class")
@Expose
private String taxClass;
@SerializedName("manage_stock")
@Expose
private Boolean manageStock;
@SerializedName("stock_quantity")
@Expose
private Integer stockQuantity;
@SerializedName("in_stock")
@Expose
private Boolean inStock;
@SerializedName("backorders")
@Expose
private String backorders;
@SerializedName("backorders_allowed")
@Expose
private Boolean backordersAllowed;
@SerializedName("backordered")
@Expose
private Boolean backordered;
@SerializedName("sold_individually")
@Expose
private Boolean soldIndividually;
@SerializedName("weight")
@Expose
private String weight;
@SerializedName("dimensions")
@Expose
private Dimensions dimensions;
@SerializedName("shipping_required")
@Expose
private Boolean shippingRequired;
@SerializedName("shipping_taxable")
@Expose
private Boolean shippingTaxable;
@SerializedName("shipping_class")
@Expose
private String shippingClass;
@SerializedName("shipping_class_id")
@Expose
private Integer shippingClassId;
@SerializedName("reviews_allowed")
@Expose
private Boolean reviewsAllowed;
@SerializedName("average_rating")
@Expose
private String averageRating;
@SerializedName("rating_count")
@Expose
private Integer ratingCount;
@SerializedName("related_ids")
@Expose
private List<Integer> relatedIds = null;
@SerializedName("upsell_ids")
@Expose
private List<Object> upsellIds = null;
@SerializedName("cross_sell_ids")
@Expose
private List<Object> crossSellIds = null;
@SerializedName("parent_id")
@Expose
private Integer parentId;
@SerializedName("purchase_note")
@Expose
private String purchaseNote;
@SerializedName("categories")
@Expose
private List<Category> categories = null;
@SerializedName("tags")
@Expose
private List<Object> tags = null;
@SerializedName("images")
@Expose
private List<Image> images = null;
@SerializedName("attributes")
@Expose
private List<Attribute> attributes = null;
@SerializedName("default_attributes")
@Expose
private List<Object> defaultAttributes = null;
@SerializedName("variations")
@Expose
private List<Integer> variations = null;
@SerializedName("grouped_products")
@Expose
private List<Object> groupedProducts = null;
@SerializedName("menu_order")
@Expose
private Integer menuOrder;
@SerializedName("meta_data")
@Expose
private List<MetaDatum> metaData = null;
@SerializedName("_links")
@Expose
private Links links;
/**
* No args constructor for use in serialization
*
*/
public ProductsByCategory() {
}
}
但是遇到了以下错误:java.lang.IllegalStateException:预期BEGIN_ARRAY但在第1行第2列路径处是BEGIN_OBJECT,或者反过来
我的代码如下:
public void onResponse(Call call, Response response) throws IOException {
String mMessage = response.body().string();
if (response.isSuccessful()) {
try {
Gson gson = new Gson();
ProductsByCategory items = gson.fromJson(mMessage, ProductsByCategory.class);
response.close();
} catch (Exception e) {
Log.e("Error", "Failed to upload");
e.printStackTrace();
}
} else {
errorMessage(mMessage);
}
}
答案 0 :(得分:0)
该错误不在Gson中,而是您的类型声明。 Json呈现的是类型数组,但是您没有将其定义为类型不匹配。将返回类型重新定义为数组。此问题还涉及类似问题:GSON throwing "Expected BEGIN_OBJECT but was BEGIN_ARRAY"?