我的情况如下:对象TableC有4个字段.只从JSON字符串中读取3个字段(field_C1,field_C2和field_C3).第四个字段field_C4在对象中使用默认值定义.
当我序列化对象实例(用于输出) - 它忽略该字段时field_C4,我期望默认值为"1"或"null".当我为程序中的实例字段显式定义一个值时"NEW",它确实将它包含在Json输出字符串中.
查看输出,在反序列化期间创建对象实例时,看起来好像也忽略了构造函数.
激活对象实例的其他字段的最佳做法是什么 - 它们不包含在输入Json String的反序列化版本中?
package newpackage;
import java.util.List;
import com.google.gson.*;
public class jsonwithconstructor {
public static void main(String[] args) throws ClassNotFoundException {
String jsonstring = "{'TableC':["
+ "{'field_C1':'C_11','field_C2':'C_12','field_C3':'C_13'},"
+ "{'field_C1':'C_21','field_C2':'C_22','field_C3':'C_23'}"
+ "]}";
jsonstring = jsonstring.replace('\'', '"');
System.out.println(jsonstring);
RootObject root = new GsonBuilder().create().fromJson(jsonstring, RootObject.class);
for (int i=0; i < root.TableC.size(); i++){
System.out.println(root.TableC.get(i));
}
System.out.println();
//root.TableC.get(0).field_C4 = "NEW";
for (int i=0; i < root.TableC.size(); i++){
System.out.println(root.TableC.get(i));
}
System.out.println();
Gson gson = new Gson();
String jsonoutput = gson.toJson(root);
System.out.println(jsonoutput);
}
public class TableC{
public String field_C1;
public String field_C2;
public String field_C3;
public String field_C4 = "1";
public TableC(){
this.field_C4 = "1";
}
@Override
public String toString() {
return ("TableC" + ", " + this.field_C1 + ", " + this.field_C2 + ", " + this.field_C3 + ", " + this.field_C4);
}
}
public class RootObject{
public List<TableC> TableC;
}
}
Run Code Online (Sandbox Code Playgroud)
输出如下所示:
{"TableC":[{"field_C1":"C_11","field_C2":"C_12","field_C3":"C_13"},{"field_C1":"C_21","field_C2":"C_22","field_C3":"C_23"}]}
TableC, C_11, C_12, C_13, null
TableC, C_21, C_22, C_23, null
TableC, C_11, C_12, C_13, NEW
TableC, C_21, C_22, C_23, null
{"TableC":[{"field_C1":"C_11","field_C2":"C_12","field_C3":"C_13","field_C4":"NEW"},{"field_C1":"C_21","field_C2":"C_22","field_C3":"C_23"}]}
Run Code Online (Sandbox Code Playgroud)
Gson 通过反射构造反序列化对象中字段的值,因此它将仅根据 JSON 中的内容设置值。在 Google 提供此问题的修复之前,您无能为力。
同时您有许多解决方法对象:
nullfinal。如果它们是不可变的,这是一个好方法。ExclusionStrategy,并使用标记应忽略的特定字段FieldAttributes
我同意所有这些都有缺点,但正如我上面所说,这是 Gson 的一个悬而未决的问题。
| 归档时间: |
|
| 查看次数: |
2425 次 |
| 最近记录: |