サーバーからそのような 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」は、3 つのタイプのいずれかになります。それぞれのクラスのプレゼンテーションを作成しました。しかし、問題は、OOP の原則により、JSON オブジェクトの正しい解析を Product クラスにどのように整理するかということです。インターフェイスを作成して 3 つのクラスのそれぞれに実装する必要がありますか?それとも、親クラスを 1 つ作成し、それを 3 つのクラスで拡張して正しく機能させる必要がありますか?
私のクラス構造。まず最初に、json の結果として取得する必要のある Product クラスのオブジェクト:
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 + "}";
}
}
2 つのサブクラスの親クラス 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;
}
}
サブクラスの 1 つ:
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);
}
この方法で実装しようとしましたが、今のところ機能しません。