Java @直到Gson中的注释未按预期工作

Java @直到Gson中的注释未按预期工作,java,json,gson,Java,Json,Gson,根据我对文档中定义的注释的理解,它支持所有版本,直到注释中包含的版本 文档: public class User { private String firstName; private String lastName; @Until(1.1) private String emailAddress; @Until(1.1) private String password; } TestData testData = new TestData(); testData.

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

文档:

 public class User {
   private String firstName;
   private String lastName;
   @Until(1.1) private String emailAddress;
   @Until(1.1) private String password;
 }
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"
}
如果使用Gson Gson=new创建Gson GsonBuilder().setVersion(1.2).create()然后是toJson()和 Gson的fromJson()方法将排除电子邮件地址和密码 字段,因为版本号传递给 GsonBuilder 1.2超出了在上设置的版本号 注释,1.1,用于这些字段

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

我的班级

class TestData {
    private String firstName;

    @Since(1.1)
    private String middleName;

    @Until(1.1)
    private String lastName;
}
测试代码:

 public class User {
   private String firstName;
   private String lastName;
   @Until(1.1) private String emailAddress;
   @Until(1.1) private String password;
 }
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"
}
输出:

 public class User {
   private String firstName;
   private String lastName;
   @Until(1.1) private String emailAddress;
   @Until(1.1) private String password;
 }
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代码中找到了进一步的调试,这导致了这种行为。显然,根据代码,即使我的注释版本与传递给Gson的版本匹配,它仍然被认为是无效的

private boolean isValidUntil(Until annotation) {
    if (annotation != null) {
      double annotationVersion = annotation.value();
      if (annotationVersion <= version) {
        return false;
      }
    }
    return true;
  }
private boolean isValidUntil(直到注释){
if(注释!=null){
double annotationVersion=annotation.value();
如果(注释版本

一种注释,用于指示成员或 类型应该存在。基本上,如果使用版本创建了
Gson
超过
注释中存储的值的数字,直到
JSON输出中将忽略字段。

但是,如果版本超过或等于您在
@中指定的版本,则返回“无效”,直到

在我看来,这似乎是代码中的一个bug(如果你认为API规范是事实的来源的话)。我已经打开了一个程序来跟踪这一点。

一种注释,用于指示成员或 类型应该存在。基本上,如果使用版本创建了
Gson
超过
注释中存储的值的数字,直到
JSON输出中将忽略字段。

但是,如果版本超过或等于您在
@中指定的版本,则返回“无效”,直到


在我看来,这似乎是代码中的一个bug(如果你认为API规范是事实的来源的话)。我已经打开了一个程序来跟踪这一点。

我不认为这是逻辑上的问题,但这是Javadoc的问题

我认为这是因为
@Until
应采用独占的值。这意味着
@Until(6)
应为小于
6
的所有版本提供值。否则,如果存在任何热修复版本


例如,如果我使用
@直到(5.5)
,我希望它只能在
5.x
版本之前工作。我有一个bug修复程序,将版本设置为
5.6
,那么我的整个逻辑将失败。

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

我认为这是因为
@Until
应采用独占的值。这意味着
@Until(6)
应为小于
6
的所有版本提供值。否则,如果存在任何热修复版本


例如,如果我使用
@Until(5.5)
我希望它只能在
5.x
版本之前工作。我有一个bug修复程序,将版本设置为
5.6
,那么我的整个逻辑将失败。

th
someName
字段在哪里?@ck它不在那里。粘贴时,我从POJO中删除了不必要的字段,用同样的方法编辑了问题。th
在哪里meName
field?@CKing它不在那里。我在粘贴时从POJO中删除了不必要的字段,并用同样的方法编辑了问题。