假设我有以下模型类:
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使用Setters?
I know how I can force Gson to use a Constructor that doesn't has any parameters,但我还能强迫Gson使用Setters吗? (或者也许是带参数的构造函数,然后我将添加另一个将所有Model的字段作为参数的构造函数。)
答案 0 :(得分:1)
我看了Gson's User Guide,看起来还没有实现..支持Getters和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个产品,所以循环重置所有字段对于移动应用程序的性能并不好。幸运的是这只在启动时发生一次..)