向后兼容JSON

时间:2015-11-05 06:48:26

标签: java json

我有一个java应用程序,它将对象的字段保存到文件中,然后再次加载它们。

到目前为止,我使用了java.util.properties.Properties文件的修改版本(属性按照它们放在属性对象中的顺序编写)。我为每个字段定义了一个属性键,并使用以下函数在属性对象中设置属性

properties.setProperty(PROPERTY_KEY_FIELD_X, field_x);

如果我想从属性文件

读回来,则使用以下函数
field_x = properties.getProperty(PROPERTY_KEY_FIELD_X, ""));

当我没有具有指定键的属性时,我可以添加一个默认值。因为我可能会在将来保存在文件中的字段的类中添加一些字段,所以我使用此选项使用默认值将字段设置为某个已定义的值,因为我加载了一个用于编写的属性文件这个班级的旧版本。

到目前为止它有效,但有一些明显的缺点,例如我不能多次使用相同的属性键,我必须添加某种索引,如1_PROPERTY_KEY2_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通常适合我的用例?

3 个答案:

答案 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类(即属性)。它是还原对象创建