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
,那么我的整个逻辑将失败。thsomeName
字段在哪里?@ck它不在那里。粘贴时,我从POJO中删除了不必要的字段,用同样的方法编辑了问题。th在哪里meName
field?@CKing它不在那里。我在粘贴时从POJO中删除了不必要的字段,并用同样的方法编辑了问题。