Java 使用POJO类在GreenDao中自定义类型

Java 使用POJO类在GreenDao中自定义类型,java,android,json,pojo,greendao,Java,Android,Json,Pojo,Greendao,这是我的JSON示例: { "open":true, "total_products":100, "product":[ { "p_id":1, "price":"5.00", "name":"blah one" }, { "p_id":2, "price":"15.00", "name":"blah two"

这是我的JSON示例:

{  
   "open":true,
   "total_products":100,
   "product":[  
      {  
         "p_id":1,
         "price":"5.00",
         "name":"blah one"
      },
      {  
         "p_id":2,
         "price":"15.00",
         "name":"blah two"
      },
...
    ]
}
这是我的POJO课程:

@Entity(nameInDb = "products")
public class ProductsPOJO {

    @SerializedName("open")
    @Property(nameInDb = "open")
    private boolean open;

    @SerializedName("total_products")
    @Property(nameInDb = "total_products")
    private Long total_products;

    @Convert(converter = ProductConverter.class, columnType = String.class)
    @SerializedName("product")
    @Property(nameInDb = "product")
    private Product product;

    public static class productConverter implements PropertyConverter<Product, String> {
        //What shoudl I write in convert part?!
        @Override
        public Product convertToEntityProperty(String databaseValue) {
            if (databaseValue == null) {
                return null;
            }
            for (Product p : Product.values()) {
                if (p.id == databaseValue) {
                    return p;
                }
            }
            return Product.DEFAULT;
        }

        @Override
        public String convertToDatabaseValue(Product entityProperty) {
            return entityProperty == null ? null : entityProperty.;
        }
        //
        /*@Override
        public Product convertToEntityProperty(String databaseValue) {
        return Product.valueOf(databaseValue);
        }

        @Override
        public String convertToDatabaseValue(Product entityProperty) {
        return entityProperty.name();
        }*/
    }

    public static class Product{
        @Id
        @SerializedName("p_id")
        private Long p_id;

        @SerializedName("price")
        @Property(nameInDb = "price")
        private String price;

        @SerializedName("name")
        @Property(nameInDb = "name")
        private String name;

        //Getters & Setters
    }

    public Product getProduct() {
        return product;
    }

    public void setProduct(Product data) {
        this.product = product;
    }

    //open & total_products Getters & Setters
}
但我不知道我应该为productConverter写些什么。 另一方面,Product类中的字段有多种类型。字符串和整数。 我读到:

编辑::/我在这里还混淆了两件事,GreenRobotObjectBox和greendao。。。很抱歉,但答案不变,只需将objectbox替换为greendao:

在我看来,你把GSON和ObjectBox GreenDao搞混了

您看起来像一个服务器响应者。但在数据库中,您通常只想保存产品实体,而不是答案。因此,最好只有一个ServerResultPOJO来用GSON解析您的答案,就像下面的代码没有经过测试,可能包含一些小错误,这只是为了让您走上正确的道路

public class ServerResultPOJO {
    @SerializedName("open")
    private boolean open;

   @SerializedName("total_products")
   private Long total_products;

   @SerializedName("product")
   private List<Product> products;
}
[Id最好不要将服务器Id用作数据库实体Id。请分别保存Id和服务器Id。自动递增和其他内容不会混淆]

然后,你不需要任何转换器,只需要一些方法将答案中的所有产品放入数据库-在放入新实体之前,你可以搜索p_id,以检查在放入之前是否需要同步到数据库

因此,首先解析您的答案,然后执行数据库操作

如果确实希望响应作为数据库实体,则需要一对多关系。但是,您不能使用相同的类进行实体和GSON解析,或者使用一些@transient字段,使事情变得更加复杂。

这是因为

GSON应为BEGIN\u数组,但为BEGIN\u对象

应该这样做:

JsonParser parser = new JsonParser();
JsonObject rootObject = parser.parse(JSON_STRING).getAsJsonObject();
//You can get the "open" and "total_products" here too.//
JsonElement productElement = rootObject.get("product");

Gson gson = new Gson();
List<Product> productList = new ArrayList<>();
//Check if "data" element is an array or an object and parse accordingly...
if (productElement.isJsonObject()) {
//The returned list has only 1 element
Product p = gson.fromJson(productElement, Product.class);
productList.add(p);
}
else if (productElement.isJsonArray()) {
//The returned list has >1 elements
Type productListType = new TypeToken<List<Product>>() {}.getType();
productList = gson.fromJson(productElement, productListType);
}
[来源:]

JsonParser parser = new JsonParser();
JsonObject rootObject = parser.parse(JSON_STRING).getAsJsonObject();
//You can get the "open" and "total_products" here too.//
JsonElement productElement = rootObject.get("product");

Gson gson = new Gson();
List<Product> productList = new ArrayList<>();
//Check if "data" element is an array or an object and parse accordingly...
if (productElement.isJsonObject()) {
//The returned list has only 1 element
Product p = gson.fromJson(productElement, Product.class);
productList.add(p);
}
else if (productElement.isJsonArray()) {
//The returned list has >1 elements
Type productListType = new TypeToken<List<Product>>() {}.getType();
productList = gson.fromJson(productElement, productListType);
}