2017-10-05 121 views
0

我是翻新的新手。我已经使用了大部分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\">&#36;<\/span>15.00<\/span><\/del> <ins><span class=\"woocommerce-Price-amount amount\"><span class=\"woocommerce-Price-currencySymbol\">&#36;<\/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": [ 

    ] 
    } 
} 
+0

我觉得你的POJO类是错误的亲切创建并从这个链接http://www.jsonschema2pojo.org/ – Lingeshwaran

+0

@Lingeshwaran我从那里 –

+0

没有创建检查POJO类你尝试打印你的回复?它是否正确? – Kunu

回答

1

虽然您使用的是JSON对象的主要目的是为了获得数据,因此注释应该得到的,而不是后

发送JSON数据的URL
public interface ApiInterface { 
    @GET("app/product.php") 
    Call<Product> getProducts(@Body JsonObject jsonObject); 
} 
+0

通过使用后im获取此错误'java.lang.IllegalArgumentException:非正文HTTP方法不能包含@Body ' –

+0

你想要做什么?我想你想获取数据,同时你还需要发布一些数据到服务器来获得这个?对吧? – Anonymous

+0

如果是这样的话,你应该使用GET而不是POST – Anonymous

1

你是暴露你的领域。

只要你不使用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>>

+0

通过使用后即时通讯获取此错误'java.lang.IllegalArgumentException:非正文HTTP方法不能包含@ Body' –

+0

是的,因为GET()不允许Body注释发送数据。保持你的POST并重写你的网络服务器以接受帖子并返回正确的数据。 –

+0

我的webservice接受发布数据..也可以通过调用获得'volley'响应' –

1
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

+0

问题不在发送数据..问题我在解析数据 –

+0

你尝试解析JSON响应http://www.jsonschema2pojo.org/获得类 – SAM

+0

是的..并从那里生成模型类 –