在Gson中@Until注释没有按预期工作

时间:2017-01-31 16:41:34

标签: java json gson

根据我对文档中定义的@Until注释的理解,它支持所有版本,直到注释中的包含版本为止。

文档:

 public class User {
   private String firstName;
   private String lastName;
   @Until(1.1) private String emailAddress;
   @Until(1.1) private String password;
 }
  

如果你用Gson gson = new创建了Gson   GsonBuilder()。setVersion(1.2).create()然后是toJson()和   fromJson()方法的Gson将排除emailAddress和密码   上面示例中的字段,因为传递给的版本号   1.2的GsonBuilder超过了直到设置的版本号   注释,1.1,用于那些领域。

因此,如果我的gson是使用1.1版构建的,那么它应该显示该类的所有4个字段。但事实并非如此。

我的班级

class TestData {
    private String firstName;

    @Since(1.1)
    private String middleName;

    @Until(1.1)
    private String lastName;
}

测试代码:

TestData testData = new TestData();
testData.setFirstName("first");
testData.setMiddleName("middle");
testData.setLastName("last");
Gson versionGson = new GsonBuilder().setPrettyPrinting().setVersion(1.1).create();
System.out.println(versionGson.toJson(testData));

输出:

{
  "firstName": "first",
  "middleName": "middle"
}
输出中缺少

lastName,即使注释值与Gson的版本匹配。

进一步调试我在gson代码下面找到this,这导致了这种行为。显然,根据代码,即使我的注释版本与传递给Gson的版本相匹配,它仍然被视为无效。

private boolean isValidUntil(Until annotation) {
    if (annotation != null) {
      double annotationVersion = annotation.value();
      if (annotationVersion <= version) {
        return false;
      }
    }
    return true;
  }

Doc,代码或我的理解是错误的吗?

2 个答案:

答案 0 :(得分:0)

javadoc

  

注释,指示成员或成员之前的版本号   类型应该存在。基本上,如果使用版本创建Gson   超过Until注释中存储的值的数字   将从JSON输出中忽略该字段。

但如果版本超过或等于您在@Until中指定的版本,则code会返回“无效”。

这似乎是代码中的错误(如果您认为API规范是事实的来源)。我打开了issue来跟踪此事。

答案 1 :(得分:0)

我认为这在逻辑上不是问题,但是在Javadoc中是一个问题。

我认为这是因为@Until应该采用排他值。这意味着@Until(6)的所有版本值都应小于6。否则,如果有任何修补程序版本。

例如,如果我使用@Until(5.5),并且希望它仅在5.x版本之前有效。并且我有一个错误修复,并将版本设置为5.6,那么我的整个逻辑将失败。