改造 - 使用Gson进行json解析时出现问题

时间:2017-10-05 06:42:10

标签: android retrofit2 gson

我是Retrofit的新手。我已经在大多数Web服务中使用了排球,决定继续使用Retrofit。但我坚持Json解析,我在POJO类中得到空数据。 我尝试通过Call<ResponseBoby>检查响应我的响应是正确的当我在我的模型类中解析时我得到空白数据。请指导我,任何帮助将不胜感激。

注意: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": [

    ]
  }
}

3 个答案:

答案 0 :(得分:1)

虽然您使用json对象将json数据发送到URL,但主要目的是获取数据,因此应该获取注释而不是post

public interface ApiInterface {
     @GET("app/product.php")
     Call<Product> getProducts(@Body JsonObject jsonObject);
}

答案 1 :(得分:1)

你暴露你的田地。

只要您不使用GSON-Settings恢复曝光,所有@EXPOSE'的年代字段将被忽略以进行序列化和反序列化。如果名称与var匹配,则不需要使用序列化名称注释(注意proguard)

public class Product implements Parcelable{
private String title;
private int id;
private String created_at;
private String updated_at;
private String type;
// ....
}

您可以使用excludeFieldsWithoutExposeAnnotation

还原

另一个原因可能是,您将数据发布到您的网络服务器。只要你的网络服务器对你的POST的响应不是上面的数据,你就什么都得不到。您的意思是@GET()吗?

同时验证您是否只获得1个产品作为repsonse。获得多个结果应该在您的改造服务中Call<List<Product>>

答案 2 :(得分: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);
}

现在对于响应类即Product,复制整个json数据并将其粘贴到http://www.jsonschema2pojo.org/并在选项中选择目标语言:java,source type:json,annotation style:gson并勾选以下复选框:

"Use primitive types"
"Use double numbers"
"Allow additional properties"

现在在android studio中生成构造函数或setter和getter。而已。如需进一步的帮助,您可以看到以下教程。

https://www.youtube.com/watch?v=y8SYedH6wC8&list=PLCBuiMPCrrW1BDDxd91tCW1OMzCRzMvjX

使用Stetho Network Interceptor了解网络通话时的最新情况。对于Stetho,请看这个链接。

https://github.com/facebook/stetho

您的Retrofit实例将进行细微更改:

OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder()
                .addNetworkInterceptor(new StethoInterceptor());

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(PRODUCT_URL)
            .client(okHttpBuilder.build())
            .addConverterFactory(GsonConverterFactory.create())
            .build();

请记住在onCreate方法中初始化Stetho并使用单例类而不是在不同的活动中创建改进实例。请点击此链接获取更多信息:

https://futurestud.io/tutorials/retrofit-getting-started-and-android-client