我有一个java应用程序,它将对象的字段保存到文件中,然后再次加载它们。
到目前为止,我使用了java.util.properties.Properties
文件的修改版本(属性按照它们放在属性对象中的顺序编写)。我为每个字段定义了一个属性键,并使用以下函数在属性对象中设置属性
properties.setProperty(PROPERTY_KEY_FIELD_X, field_x);
如果我想从属性文件
读回来,则使用以下函数field_x = properties.getProperty(PROPERTY_KEY_FIELD_X, ""));
当我没有具有指定键的属性时,我可以添加一个默认值。因为我可能会在将来保存在文件中的字段的类中添加一些字段,所以我使用此选项使用默认值将字段设置为某个已定义的值,因为我加载了一个用于编写的属性文件这个班级的旧版本。
到目前为止它有效,但有一些明显的缺点,例如我不能多次使用相同的属性键,我必须添加某种索引,如1_PROPERTY_KEY
,2_PROPERTY_KEY
。这就是我遇到JSON的原因。
我对JSON以及我们可以用它实现的所有功能都不是很熟悉。但是我知道我可以使用它将对象的字段保存为JSON表示法并以Gson的形式将其读回来
//Object to JSON
Gson gson = new Gson();
String json = gson.toJson(object);
//JSON to Object
object = gson.fromJson(json);
但是我认为如果在尝试从JSON读回时类是更新的版本(即一些新字段),这将失败。我怎么能这样对待?我是否必须处理与当前具有属性的实现类似的每个单独字段?例如像这样(com.google.gson
),假设jsonString
是从文件中读取的字符串:
//try/catch block omitted
JSONParser parser = new JSONParser();
JSONElement json = parser.parse(jsonString);
field_x = json.getAsString("field_x");
如果某些内容未能为字段设置默认值,请注意?
或者是否有一种完全不同的方法,没有JSON或JSON通常适合我的用例?
答案 0 :(得分:2)
使用GSON,您可以将模型定义为对象。举个例子:
public class Configuration
{
private String x;
private String y;
}
稍后,您可以调整Configuration
以增加一个字段z
:
public class Configuration
{
private String x;
private String y;
private String z;
}
当您使用GSON反序列化不包含z
值的JSON文件时,它将保留null
(或者该类型的Java默认值为。)
由于您有一个对象,因此可以定义替换默认值的getter(如果未指定):
public String getZ()
{
if (this.z == null)
{
return "the default z value";
}
return this.z;
}
答案 1 :(得分:2)
我也不是JSON的专家。但我有时用它Jackson,我认为Gson非常相似。如果要使用版本化对象,只需在对象构造函数中确保为字段指定默认值(在正确的值范围之外)。杰克逊只会匹配那些在Java对象中找到通讯记录的json字段。否则保留默认值。
答案 2 :(得分:0)
如果您不是通过网络发送数据,我认为您不需要Json但使用本机Java类(即属性)。它是还原对象创建