1

GSONでオブジェクト化するために解析する必要があるjsonを取得します。

"product":{
"product_type":"assignment",
"id":717,
    "product_profile":{
    "title":"new Order from java",
    "info":"Some special info",
    "dtl_expl":true,
    "special_info":""
    }
}

「product_profile」は、「product_type」で取得したものに応じて異なるオブジェクトになります。そのオブジェクトごとにクラスを作成しました-割り当てと書き込み。それらはProductTypeクラスの子です。正しいオブジェクトを返す必要があるProductクラスにインターフェイスを実装します-割り当てまたは書き込みは、「product_type」の値によって異なります。私の製品クラス

public class Product implements IProductType{
    ProductAssignment prodAss;
    ProductWriting prodWr;
    ProductType returnState;

    @SerializedName("id")
    int id;
    @SerializedName("product_type")
    String product_type;
    @SerializedName("product_profile")
    ProductType product_profile;
    public Product()
    {

    }
    public Product(int id, String product_type, ProductType product_profile)
    {
        this.id = id;
        this.product_type = product_type;
        this.product_profile = product_profile;
    }
    public int getProductId() 
    {
         return this.id;
    }
    public String getProductType() 
    {
         return this.product_type;
    }
    public ProductType getProduct() 
    {
         return this.returnObject(product_type);
    }
    public void setProductId(int id) 
    {
        this.id = id;
    }
    public void setProductTitle(String product_type) 
    {
        this.product_type = product_type;
    }
    public void setProduct(ProductType product_profile) 
    {
        this.product_profile =  this.returnObject(product_type);
    }
    @Override
    public String toString() {
        return "id=" + id + " " + "title=" + product_type
                + " " + "profile=" + product_profile  +  "}";
    }
    @Override
    public ProductType returnObject(String res) 
    {

        System.out.println("Product");
        System.out.println(product_profile);
        if (res.equals("assignment"))
        {
            this.product_profile = new ProductAssignment();
            System.out.println("I'm going to parse Assignment");
        }
        else if  (res.equals("writing"))
            this.product_profile =  new ProductWriting();

        return product_profile;

    }

}

しかし、jsonを解析して次のようなオブジェクトにしようとすると:

  Gson gson = new Gson();
  Product product = gson.fromJson(res,Product.class);

私はそのような製品オブジェクトを取得します:

id=447 title=assignment profile=ProductType@e49f9fa

したがって、「id」と「product_type」は正しく解析されますが、ProdutTypeのAssignmentオブジェクトではありません。

私のProductTypeクラス:

   public class ProductType implements IProductType{
    String product;

    static ProductType productType;
    static ProductAssignment productAssignment;
    static ProductWriting productWriting;
    IProductType component;

    ProductType returnState;
    ProductAssignment prodAss;
    ProductWriting prodWr;
    public ProductType()
    {       
    }
    public ProductType(IProductType c)
    {
         component = c;
    }
    public ProductType getProductType()
    {
        return this.returnState;
    }
    public void setProductType(ProductType returnState)
    {
        this.returnState = returnState;
    }
    @Override
    public ProductType returnObject(String product_type) 
    {
        if (product_type.equals("assignment"))
        {
            this.returnState = new ProductAssignment();
            System.out.println("I'm going to parse Assignment");
        }
        else if  (product_type.equals("writing"))
            this.returnState =  new ProductWriting();

        return returnState;
    }
    @Override
    public String toString()
    {
        return returnState.getClass().getName();
    }

}
4

1 に答える 1

0

うまく見えます。正しい出力を得るtoString()には、ProductTypeクラスでオーバーライドする必要があります。

于 2012-11-21T09:57:11.653 に答える