Skip to content

Commit bebb0a1

Browse files
committed
support SetVersion
1 parent a7f9ede commit bebb0a1

3 files changed

Lines changed: 86 additions & 1 deletion

File tree

src/main/java/com/jsoniter/extra/GsonCompatibilityMode.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.google.gson.FieldNamingStrategy;
55
import com.google.gson.annotations.Expose;
66
import com.google.gson.annotations.SerializedName;
7+
import com.google.gson.annotations.Since;
8+
import com.google.gson.annotations.Until;
79
import com.jsoniter.JsonIterator;
810
import com.jsoniter.annotation.JsonIgnore;
911
import com.jsoniter.annotation.JsonProperty;
@@ -66,6 +68,7 @@ protected DateFormat initialValue() {
6668
}
6769
};
6870
private FieldNamingStrategy fieldNamingStrategy;
71+
private Double version;
6972

7073
public Builder excludeFieldsWithoutExposeAnnotation() {
7174
excludeFieldsWithoutExposeAnnotation = true;
@@ -122,6 +125,11 @@ public Builder disableHtmlEscaping() {
122125
return this;
123126
}
124127

128+
public Builder setVersion(double version) {
129+
this.version = version;
130+
return this;
131+
}
132+
125133
public GsonCompatibilityMode build() {
126134
escapeUnicode(false);
127135
return (GsonCompatibilityMode) super.build();
@@ -144,7 +152,9 @@ public boolean equals(Object o) {
144152
if (serializeNulls != builder.serializeNulls) return false;
145153
if (disableHtmlEscaping != builder.disableHtmlEscaping) return false;
146154
if (!dateFormat.get().equals(builder.dateFormat.get())) return false;
147-
return fieldNamingStrategy != null ? fieldNamingStrategy.equals(builder.fieldNamingStrategy) : builder.fieldNamingStrategy == null;
155+
if (fieldNamingStrategy != null ? !fieldNamingStrategy.equals(builder.fieldNamingStrategy) : builder.fieldNamingStrategy != null)
156+
return false;
157+
return version != null ? version.equals(builder.version) : builder.version == null;
148158
}
149159

150160
@Override
@@ -155,6 +165,7 @@ public int hashCode() {
155165
result = 31 * result + (disableHtmlEscaping ? 1 : 0);
156166
result = 31 * result + dateFormat.get().hashCode();
157167
result = 31 * result + (fieldNamingStrategy != null ? fieldNamingStrategy.hashCode() : 0);
168+
result = 31 * result + (version != null ? version.hashCode() : 0);
158169
return result;
159170
}
160171

@@ -166,6 +177,7 @@ public Config.Builder copy() {
166177
copied.disableHtmlEscaping = disableHtmlEscaping;
167178
copied.dateFormat = dateFormat;
168179
copied.fieldNamingStrategy = fieldNamingStrategy;
180+
copied.version = version;
169181
return copied;
170182
}
171183
}
@@ -294,6 +306,18 @@ public void updateClassDescriptor(ClassDescriptor desc) {
294306
if (builder().serializeNulls) {
295307
binding.shouldOmitNull = false;
296308
}
309+
if (builder().version != null) {
310+
Since since = binding.getAnnotation(Since.class);
311+
if (since != null && builder().version < since.value()) {
312+
binding.toNames = new String[0];
313+
binding.fromNames = new String[0];
314+
}
315+
Until until = binding.getAnnotation(Until.class);
316+
if (until != null && builder().version >= until.value()) {
317+
binding.toNames = new String[0];
318+
binding.fromNames = new String[0];
319+
}
320+
}
297321
}
298322
super.updateClassDescriptor(desc);
299323
}

src/test/java/com/jsoniter/TestGson.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import com.google.gson.GsonBuilder;
77
import com.google.gson.annotations.Expose;
88
import com.google.gson.annotations.SerializedName;
9+
import com.google.gson.annotations.Since;
10+
import com.google.gson.annotations.Until;
911
import com.jsoniter.extra.GsonCompatibilityMode;
1012
import com.jsoniter.output.JsonStream;
1113
import junit.framework.TestCase;
@@ -116,4 +118,36 @@ public void test_setFieldNamingPolicy() {
116118
obj = JsonIterator.deserialize(config, "{\"Field1\":\"hello\"}", TestObject3.class);
117119
assertEquals("hello", obj.field1);
118120
}
121+
122+
public static class TestObject5 {
123+
@Since(3.0)
124+
public String field1 = "";
125+
@Until(1.0)
126+
public String field2 = "";
127+
@Since(2.0)
128+
public String field3 = "";
129+
@Until(2.0)
130+
public String field4 = "";
131+
}
132+
133+
public void test_setVersion() {
134+
Gson gson = new GsonBuilder()
135+
.setVersion(2.0)
136+
.create();
137+
TestObject5 obj = gson.fromJson("{\"field1\":\"field1\",\"field2\":\"field2\",\"field3\":\"field3\",\"field4\":\"field4\"}",
138+
TestObject5.class);
139+
assertEquals("", obj.field1);
140+
assertEquals("", obj.field2);
141+
assertEquals("field3", obj.field3);
142+
assertEquals("", obj.field4);
143+
GsonCompatibilityMode config = new GsonCompatibilityMode.Builder()
144+
.setVersion(2.0)
145+
.build();
146+
obj = JsonIterator.deserialize(config, "{\"field1\":\"field1\",\"field2\":\"field2\",\"field3\":\"field3\",\"field4\":\"field4\"}",
147+
TestObject5.class);
148+
assertEquals("", obj.field1);
149+
assertEquals("", obj.field2);
150+
assertEquals("field3", obj.field3);
151+
assertEquals("", obj.field4);
152+
}
119153
}

src/test/java/com/jsoniter/output/TestGson.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import com.google.gson.GsonBuilder;
77
import com.google.gson.annotations.Expose;
88
import com.google.gson.annotations.SerializedName;
9+
import com.google.gson.annotations.Since;
10+
import com.google.gson.annotations.Until;
911
import com.jsoniter.extra.GsonCompatibilityMode;
1012
import com.jsoniter.spi.JsoniterSpi;
1113
import junit.framework.TestCase;
@@ -230,4 +232,29 @@ public void test_disableHtmlEscaping_on() {
230232
output = JsonStream.serialize(config, "<html>&nbsp;</html>");
231233
assertEquals("\"\\u003chtml\\u003e\\u0026nbsp;\\u003c/html\\u003e\"", output);
232234
}
235+
236+
public static class TestObject5 {
237+
@Since(3.0)
238+
public String field1 = "field1";
239+
@Until(1.0)
240+
public String field2 = "field2";
241+
@Since(2.0)
242+
public String field3 = "field3";
243+
@Until(2.0)
244+
public String field4 = "field4";
245+
}
246+
247+
public void test_setVersion() {
248+
TestObject5 obj = new TestObject5();
249+
Gson gson = new GsonBuilder()
250+
.setVersion(2.0)
251+
.create();
252+
String output = gson.toJson(obj);
253+
assertEquals("{\"field3\":\"field3\"}", output);
254+
GsonCompatibilityMode config = new GsonCompatibilityMode.Builder()
255+
.setVersion(2.0)
256+
.build();
257+
output = JsonStream.serialize(config, obj);
258+
assertEquals("{\"field3\":\"field3\"}", output);
259+
}
233260
}

0 commit comments

Comments
 (0)