强制GSON使用通常包含Setter或Setter的构造方法,而不使用Fields - java

假设我有以下Model类:

public class Product
{
    private int ProductId;
    private String Name;

    public Product(){
        setProductId(0);
        setName("");
    }

    // Getter and Setter for the Product-ID
    public void setProductId(int i){
        if(i >= 0) {
            ProductId = i;
        } else {
            ProductId = 0;
        }
    }
    public int getProductId(){
        return ProductId;
    }

    // Getter and Setter for the Name
    public void setName(String n){
        if(n != null && n.length() > 0) {
            name = n;
        } else {
            name = ""; 
        }
    }
    public String getName(){
        return name;
    }
}

以下Json-Strings:

"[{\"$id\":\"1\",\"ProductId\":1,\"Name\":\"A Product\"}," + 
"{\"$id\":\"2\",\"ProductId\":2,\"Name\":\"Another Product\"}]";

"[{\"$id\":\"1\",\"ProductId\":1,\"Name\":\"A Product\"}," + 
"{\"$id\":\"2\",\"ProductId\":-4,\"Name\":null}]";

以及以下转换方法:

public void jsonToProducts(String json){
    ArrayList<Product> p = null;
    if(json != null && json.length() > 0){
        try{
            Type listType = new TypeToken<ArrayList<Product>>(){}.getType();
            p = new Gson().fromJson(json, listType);
        }
        catch(JsonParseException ex){
            ex.printStackTrace();
        }
    }
    setProducts(p);
}

默认情况下,Gson使用这些字段。因此,我得到了两个Json-Strings的以下结果:

// Json-String 1:
Product 1: ProductId = 1; Name = "A Product";
Product 2: ProductId = 2; Name = "Another Product";

^这是我想要的结果,所以这里没有问题。

// Json-String 2:
Product 1: ProductId = 1; Name = "A Product";
Product 2: ProductId = -4; Name = null;

^这不是我想要的结果,因为对于第二个产品,我想要这个:

Product 2: ProductId = 0; Name = "";

如何强制Gson改用二传手?

I know how I can force Gson to use a Constructor that doesn't has any parameters,但是我也可以强迫Gson使用Setters吗? (或者也许是带有参数的构造函数,然后我将添加另一个将所有Model字段作为参数的构造函数。)

参考方案

我看过Gson's User Guide,看来还没有实现。.支持getter和setter放在their TODO/issues-list(issue 232)上。

我有一个临时的(低效而丑陋的解决方案):

public void jsonToProducts(String json){
    ArrayList<Product> products = null;
    if(json != null && json.length() > 0){
        try{
            Type listType = new TypeToken<ArrayList<Product>>(){}.getType();
            products = new Gson().fromJson(json, listType);
        }
        catch(JsonParseException ex){
            ex.printStackTrace();
        }
    }
    // TODO: Replace when Gson supports Setters or Parameterized Constructors
    if(products != null && products.size() > 0){
        for(Product p : products){
            p.setProductId(p.getProductId());
            p.setName(p.getName());
        }
    }

    setProducts(products);
}

我现在将接受此作为答案。如果有人知道更好的方法来解决Gson缺少Setter支持的问题,我将不胜感激。 (特别是因为我的“产品列表”大约有1250个产品,因此,在其中循环遍历以重置所有字段对于移动应用程序的性能并不是很好。幸运的是,这种情况仅在启动时发生一次。)

JSON PATH字段NULL检查表达式 - java

我有一个像bellow的json数组:{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sa…

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java Scanner读取文件的奇怪行为 - java

因此,在使用Scanner类从文件读取内容时,我遇到了一个有趣的问题。基本上,我试图从目录中读取解析应用程序生成的多个输出文件,以计算一些准确性指标。基本上,我的代码只是遍历目录中的每个文件,并使用扫描仪将其打开以处理内容。无论出于何种原因,扫描程序都不会读取其中的一些文件(所有UTF-8编码)。即使文件不是空的,scanner.hasNextLine()在…

Java-字符串中char的倒数第二次出现 - java

假设我有琴弦String path = "the/quick/brown/fox/jumped/over/the/lazy/dog/"; 我想要以下输出String output = "the/quick/brown/fox/jumped/over/the/lazy/"; 我在想以下会做output = path.su…

Java Map,如何将UTF-8字符串正确放置到地图? - java

我有一个地图,LinkedHashMap更确切地说。我想在上面放一个字符串对象。然后,我读取此值以查看实际存储的内容。字符串本身具有非ASCII字符(西里尔文,韩文等)。将其放到地图上然后阅读后,这些字符将替换为??? s。一些代码:Map obj = new LinkedHashMap(); System.out.println("name: &…