我从服务器获得了这样的 JSON,并希望将其解析为我的对象:
"product":{
"product_type":"assignment",
"id":717,
"product_profile":{
"title":"new Order from java",
"info":"Some special info",
"dtl_expl":true,
"special_info":""
}
}
取决于“product_type”值,我从服务器获得不同的“product_profile”值。“product_profile”可以是三种类型之一。我为他们每个人创建了课堂演示。但问题是,由于 OOP 原则,如何将 JSON 对象的正确解析组织到我的 Product 类中?我应该创建接口并在我的三个类中的每一个中实现它,还是我应该创建一个父类并在我的三个类中扩展它以使其正常工作?
我的班级结构。首先是 Product 类,我应该从 json 得到它的对象:
public class Product {
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.returnObject(product_type);
}
public int getProductId()
{
return this.id;
}
public String getProductType()
{
return this.product_type;
}
public ProductType getProduct()
{
return product_profile.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 = product_profile;
}
@Override
public String toString() {
return "id=" + id + " " + "title=" + product_type
+ " " + "profile=" + product_profile + "}";
}
}
现在父类 ProductType 有两个子类:
public class ProductType extends ProductType{
String product;
static ProductType productType;
static ProductAssignment productAssignment;
static ProductWriting productWriting;
IProductType component;
private ProductType returnState;
ProductAssignment prodAss;
ProductWriting prodWr;
public ProductType()
{
}
public ProductType(IProductType c)
{
component = c;
}
// implemented method of interface
@Override
public ProductType returnObject(String product_type)
{
System.out.println("ProductType");
if (product_type.equals("assignment"))
returnState = prodAss.returnObject(product_type);
else if (product_type.equals("writing"))
returnState = prodWr.returnObject(product_type);
System.out.println(returnState.getClass().getName());
return returnState;
}
}
子类之一:
public class ProductWriting extends ProductType{
@SerializedName("id")
int id;
@SerializedName("title")
String title;
@SerializedName("pages_number")
int pages_number;
@SerializedName("number_of_references")
String number_of_references;
@SerializedName("dtl_expl")
boolean dtl_expl;
@SerializedName("info")
String info;
public ProductWriting()
{}
public ProductWriting(String title, String info, boolean dtl_expl,
int pages_number ,
int id,String number_of_references)
{
this.title = title;
this.info = info ;
this.dtl_expl = dtl_expl;
this.id = id;
this.pages_number = pages_number;
this.number_of_references = number_of_references;
}
public ProductWriting(IProductType c){
super(c);
}
// getters and setters
@Override
public ProductType returnObject(String res) {
System.out.println("Writing");
super.returnObject(res);
return new ProductWriting();
}
}
另一个 :
public class ProductAssignment extends ProductType{
ProductAssignment thisObj;
@SerializedName("title")
String title;
@SerializedName("info")
String info;
@SerializedName("dtl_expl")
boolean dtl_expl;
@SerializedName("special_info")
String special_info;
@SerializedName("shoot_exclusive_video")
boolean shoot_exclusive_video;
@SerializedName("shoot_common_video")
boolean shoot_common_video;
public ProductAssignment()
{}
public ProductAssignment(String title, String info, boolean dtl_expl, String special_info,
boolean shoot_common_video, boolean shoot_exclusive_video)
{
this.title = title;
this.info = info ;
this.dtl_expl = dtl_expl;
this.special_info = special_info;
this.shoot_common_video = shoot_common_video;
this.shoot_exclusive_video =shoot_exclusive_video;
}
// getters and setters
@Override
public ProductType returnObject(String res) {
System.out.println("Assignment");
super.returnObject(res);
return new ProductAssignment();
}
@Override
public String toString()
{
return "title=" + title + "info " + "=" + info
+ " " + "profile=" + dtl_expl + "}";
}
}
绑定我的类的接口:
public interface IProductType
{
ProductType returnObject(String parse);
}
我试图以这种方式实现,但它现在不起作用。