Retrofit-使用Gson解析json的问题
我是翻新的新手。我已经使用了大部分Web服务,决定继续改进。但是我停留在Json解析上,我在POJO类中得到空数据。 我试图通过Call<ResponseBoby>
检查响应,当我使用解析我的模型类时,我的回答是正确的,我收到空白数据。请指导我,任何帮助将不胜感激。Retrofit-使用Gson解析json的问题
注意:POJO类是parcelable,也包含cunstructor和gette/setter。我从这里删除了文字限制的原因。
CODE
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(PRODUCT_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiInterface apiService = retrofit.create(ApiInterface.class);
JsonObject ob = new JsonObject();
ob.addProperty("pro_id", model.getId());
Call<Product> call = apiService.getProducts(ob);
call.enqueue(new Callback<Product>() {
@Override
public void onResponse(Call<Product> call, Response<Product> response) {
Product p = response.body();
Toast.makeText(getActivity(), response.body().getTitle(), Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Call<Product> call, Throwable t) {
Log.e("ERROR",call.toString());
}
});
API接口
public interface ApiInterface {
@POST("app/product.php")
Call<Product> getProducts(@Body JsonObject jsonObject);
}
POJO类
public class Product {
@SerializedName("title")
@Expose
public String title;
@SerializedName("id")
@Expose
public int id;
@SerializedName("created_at")
@Expose
public String createdAt;
@SerializedName("updated_at")
@Expose
public String updatedAt;
@SerializedName("type")
@Expose
public String type;
@SerializedName("status")
@Expose
public String status;
@SerializedName("downloadable")
@Expose
public boolean downloadable;
@SerializedName("virtual")
@Expose
public boolean virtual;
@SerializedName("permalink")
@Expose
public String permalink;
@SerializedName("sku")
@Expose
public String sku;
@SerializedName("price")
@Expose
public String price;
@SerializedName("regular_price")
@Expose
public String regularPrice;
@SerializedName("sale_price")
@Expose
public Object salePrice;
@SerializedName("price_html")
@Expose
public String priceHtml;
@SerializedName("taxable")
@Expose
public boolean taxable;
@SerializedName("tax_status")
@Expose
public String taxStatus;
@SerializedName("tax_class")
@Expose
public String taxClass;
@SerializedName("managing_stock")
@Expose
public boolean managingStock;
@SerializedName("stock_quantity")
@Expose
public int stockQuantity;
@SerializedName("in_stock")
@Expose
public boolean inStock;
@SerializedName("backorders_allowed")
@Expose
public boolean backordersAllowed;
@SerializedName("backordered")
@Expose
public boolean backordered;
@SerializedName("sold_individually")
@Expose
public boolean soldIndividually;
@SerializedName("purchaseable")
@Expose
public boolean purchaseable;
@SerializedName("featured")
@Expose
public boolean featured;
@SerializedName("visible")
@Expose
public boolean visible;
@SerializedName("catalog_visibility")
@Expose
public String catalogVisibility;
@SerializedName("on_sale")
@Expose
public boolean onSale;
@SerializedName("product_url")
@Expose
public String productUrl;
@SerializedName("button_text")
@Expose
public String buttonText;
@SerializedName("weight")
@Expose
public Object weight;
@SerializedName("dimensions")
@Expose
public Dimensions dimensions;
@SerializedName("shipping_required")
@Expose
public boolean shippingRequired;
@SerializedName("shipping_taxable")
@Expose
public boolean shippingTaxable;
@SerializedName("shipping_class")
@Expose
public String shippingClass;
@SerializedName("shipping_class_id")
@Expose
public Object shippingClassId;
@SerializedName("description")
@Expose
public String description;
@SerializedName("short_description")
@Expose
public String shortDescription;
@SerializedName("reviews_allowed")
@Expose
public boolean reviewsAllowed;
@SerializedName("average_rating")
@Expose
public String averageRating;
@SerializedName("rating_count")
@Expose
public int ratingCount;
@SerializedName("related_ids")
@Expose
public List<Integer> relatedIds = new ArrayList<Integer>();
@SerializedName("upsell_ids")
@Expose
public List<Object> upsellIds = new ArrayList<Object>();
@SerializedName("cross_sell_ids")
@Expose
public List<Integer> crossSellIds = new ArrayList<Integer>();
@SerializedName("parent_id")
@Expose
public int parentId;
@SerializedName("categories")
@Expose
public List<String> categories = new ArrayList<String>();
@SerializedName("tags")
@Expose
public List<Object> tags = new ArrayList<Object>();
@SerializedName("images")
@Expose
public List<Image> images = new ArrayList<Image>();
@SerializedName("featured_src")
@Expose
public String featuredSrc;
@SerializedName("attributes")
@Expose
public List<Attribute> attributes = new ArrayList<Attribute>();
@SerializedName("downloads")
@Expose
public List<Object> downloads = new ArrayList<Object>();
@SerializedName("download_limit")
@Expose
public int downloadLimit;
@SerializedName("download_expiry")
@Expose
public int downloadExpiry;
@SerializedName("download_type")
@Expose
public String downloadType;
@SerializedName("purchase_note")
@Expose
public String purchaseNote;
@SerializedName("total_sales")
@Expose
public int totalSales;
@SerializedName("variations")
@Expose
public List<Variation> variations = new ArrayList<Variation>();
@SerializedName("parent")
@Expose
public List<Object> parent = new ArrayList<Object>();
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
JSON响应
{
"product": {
"title": "Flying Ninja",
"id": 70,
"created_at": "2013-06-07T11:25:01Z",
"updated_at": "2017-09-26T05:55:35Z",
"type": "simple",
"status": "publish",
"downloadable": false,
"virtual": false,
"permalink": "http:\/\/codiixx.com\/product\/flying-ninja\/",
"sku": "",
"price": "12.00",
"regular_price": "15.00",
"sale_price": "12.00",
"price_html": "<del><span class=\"woocommerce-Price-amount amount\"><span class=\"woocommerce-Price-currencySymbol\">$<\/span>15.00<\/span><\/del> <ins><span class=\"woocommerce-Price-amount amount\"><span class=\"woocommerce-Price-currencySymbol\">$<\/span>12.00<\/span><\/ins>",
"taxable": true,
"tax_status": "taxable",
"tax_class": "",
"managing_stock": false,
"stock_quantity": null,
"in_stock": true,
"backorders_allowed": false,
"backordered": false,
"sold_individually": false,
"purchaseable": true,
"featured": false,
"visible": true,
"catalog_visibility": "visible",
"on_sale": true,
"product_url": "",
"button_text": "",
"weight": null,
"dimensions": {
"length": "",
"width": "",
"height": "",
"unit": "cm"
},
"shipping_required": true,
"shipping_taxable": true,
"shipping_class": "",
"shipping_class_id": null,
"description": "<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.<\/p>\n",
"short_description": "<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.<\/p>\n",
"reviews_allowed": true,
"average_rating": "4.00",
"rating_count": 4,
"related_ids": [
76,
79,
73,
67
],
"upsell_ids": [
],
"cross_sell_ids": [
],
"parent_id": 0,
"categories": [
"Posters"
],
"tags": [
],
"images": [
{
"id": 71,
"created_at": "2013-06-07T11:24:19Z",
"updated_at": "2013-06-07T11:24:19Z",
"src": "http:\/\/codiixx.com\/wp-content\/uploads\/2013\/06\/poster_2_up.jpg",
"title": "poster_2_up",
"alt": "",
"position": 0
},
{
"id": 72,
"created_at": "2013-06-07T11:24:47Z",
"updated_at": "2013-06-07T11:24:47Z",
"src": "http:\/\/codiixx.com\/wp-content\/uploads\/2013\/06\/Poster_2_flat.jpg",
"title": "Poster_2_flat",
"alt": "",
"position": 1
},
{
"id": 10260,
"created_at": "2017-07-10T06:51:22Z",
"updated_at": "2017-07-10T06:51:22Z",
"src": "http:\/\/codiixx.com\/wp-content\/uploads\/2017\/07\/images.jpeg",
"title": "images",
"alt": "",
"position": 2
},
{
"id": 10261,
"created_at": "2017-07-10T06:52:18Z",
"updated_at": "2017-07-10T06:52:18Z",
"src": "http:\/\/codiixx.com\/wp-content\/uploads\/2017\/07\/Jazbaa-Movie-Full-Audio-Album-Free-Download-Mp3-Song-2015.jpg",
"title": "Jazbaa-Movie-Full-Audio-Album-Free-Download-Mp3-Song-2015",
"alt": "",
"position": 3
},
{
"id": 10264,
"created_at": "2017-07-10T09:34:49Z",
"updated_at": "2017-07-10T09:34:49Z",
"src": "http:\/\/codiixx.com\/wp-content\/uploads\/2017\/07\/entrepreneur-593371_640.jpg",
"title": "entrepreneur-593371_640",
"alt": "",
"position": 4
},
{
"id": 10234,
"created_at": "2017-04-06T06:01:10Z",
"updated_at": "2017-04-06T06:01:10Z",
"src": "http:\/\/codiixx.com\/wp-content\/uploads\/2017\/04\/img1.jpg",
"title": "img1",
"alt": "",
"position": 5
},
{
"id": 469,
"created_at": "2016-11-04T06:26:58Z",
"updated_at": "2017-04-06T05:03:30Z",
"src": "http:\/\/codiixx.com\/wp-content\/uploads\/2016\/11\/test1-1.jpg",
"title": "test1",
"alt": "",
"position": 6
},
{
"id": 10215,
"created_at": "2017-03-28T06:17:00Z",
"updated_at": "2017-04-06T05:03:29Z",
"src": "http:\/\/codiixx.com\/wp-content\/uploads\/2017\/03\/download.jpg",
"title": "download",
"alt": "",
"position": 7
},
{
"id": 327,
"created_at": "2016-06-24T10:42:33Z",
"updated_at": "2016-06-24T10:42:33Z",
"src": "http:\/\/codiixx.com\/wp-content\/uploads\/2016\/06\/logo-phoeniixx.jpg",
"title": "logo-phoeniixx",
"alt": "",
"position": 8
},
{
"id": 98,
"created_at": "2013-06-07T11:37:17Z",
"updated_at": "2013-06-07T11:37:17Z",
"src": "http:\/\/codiixx.com\/wp-content\/uploads\/2013\/06\/cd_5_flat.jpg",
"title": "cd_5_flat",
"alt": "",
"position": 9
}
],
"featured_src": "http:\/\/codiixx.com\/wp-content\/uploads\/2013\/06\/poster_2_up.jpg",
"attributes": [
],
"downloads": [
],
"download_limit": -1,
"download_expiry": -1,
"download_type": "standard",
"purchase_note": "",
"total_sales": 91,
"variations": [
],
"parent": [
]
}
}
虽然您使用的是JSON对象的主要目的是为了获得数据,因此注释应该得到的,而不是后
发送JSON数据的URLpublic interface ApiInterface {
@GET("app/product.php")
Call<Product> getProducts(@Body JsonObject jsonObject);
}
你是暴露你的领域。
只要你不使用GSON-Settings恢复暴露所有@EXPOSE
'd annoated字段将被序列化和反序列化忽略。你不需要,如果你的名字相匹配变种确实使用序列名称注记(约需proguard的照顾)
public class Product implements Parcelable{
private String title;
private int id;
private String created_at;
private String updated_at;
private String type;
// ....
}
您可以还原使用excludeFieldsWithoutExposeAnnotation
另一个原因可能是,那找你过帐数据到您的网络服务器。只要你的web服务器对你的POST的响应不是上面的数据,你不会得到任何东西。你的意思是@GET()
?
同时验证您是否仅获得1件产品作为repsonse。在您的改造服务中获得多个结果应该是Call<List<Product>>
。
通过使用后即时通讯获取此错误'java.lang.IllegalArgumentException:非正文HTTP方法不能包含@ Body' –
是的,因为GET()不允许Body注释发送数据。保持你的POST并重写你的网络服务器以接受帖子并返回正确的数据。 –
我的webservice接受发布数据..也可以通过调用
JsonObject ob = new JsonObject();
ob.addProperty("pro_id", model.getId());
而不是发送一个json对象,做一个你将发送的模型类。见下面的实施模型类即DTO:
PropertyDTO.java
public class PropertyDTO {
@SerialisedName("pro_id")
@Expose
private String proId;
public String getProId(){
return proId;
}
public void setProId(String s) {
this.proId = s;
}
}
更改API接口是这样的:
public interface ApiInterface {
@POST("app/product.php")
Call<Product> productsAPI(@Body PropertyDTO ob);
}
现在为响应类我。E产品,复制整个JSON数据,并将其粘贴http://www.jsonschema2pojo.org/并在选项中选择目标语言:JAVA,光源类型:JSON,注释风格:GSON并勾选下面的复选框:
"Use primitive types"
"Use double numbers"
"Allow additional properties"
现在在Android Studio中产生构造函数或setters和getters。而已。有关更多帮助,请参阅以下教程。
https://www.youtube.com/watch?v=y8SYedH6wC8&list=PLCBuiMPCrrW1BDDxd91tCW1OMzCRzMvjX
使用Stetho网络拦截,才能知道怎么回事,而你做的网络电话。对于Stetho,请参阅此链接。
https://github.com/facebook/stetho
你的改造实例将有一个小的变化:
OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder()
.addNetworkInterceptor(new StethoInterceptor());
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(PRODUCT_URL)
.client(okHttpBuilder.build())
.addConverterFactory(GsonConverterFactory.create())
.build();
记住要初始化你Stetho在onCreate方法和使用的,而不是在不同的活动创造改装实例一个单独的类。请点击此链接获取更多信息:
https://futurestud.io/tutorials/retrofit-getting-started-and-android-client
我觉得你的POJO类是错误的亲切创建并从这个链接http://www.jsonschema2pojo.org/ – Lingeshwaran
@Lingeshwaran我从那里 –
没有创建检查POJO类你尝试打印你的回复?它是否正确? – Kunu