Skip to content

Commit 73d20cb

Browse files
committed
add support of Config
1 parent 2dce222 commit 73d20cb

24 files changed

Lines changed: 219 additions & 203 deletions

src/main/java/com/jsoniter/JsonIterator.java

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package com.jsoniter;
22

3-
import com.jsoniter.annotation.JsoniterAnnotationSupport;
43
import com.jsoniter.any.Any;
5-
import com.jsoniter.spi.JsonException;
6-
import com.jsoniter.spi.Slice;
7-
import com.jsoniter.spi.TypeLiteral;
4+
import com.jsoniter.spi.*;
85

96
import java.io.Closeable;
107
import java.io.IOException;
@@ -366,14 +363,39 @@ protected JsonIterator initialValue() {
366363
}
367364
};
368365

366+
public static final <T> T deserialize(Config config, String input, Class<T> clazz) {
367+
JsoniterSpi.setCurrentConfig(config);
368+
try {
369+
return deserialize(input.getBytes(), clazz);
370+
} finally {
371+
JsoniterSpi.clearCurrentConfig();
372+
}
373+
}
369374
public static final <T> T deserialize(String input, Class<T> clazz) {
370375
return deserialize(input.getBytes(), clazz);
371376
}
372377

378+
public static final <T> T deserialize(Config config, String input, TypeLiteral<T> typeLiteral) {
379+
JsoniterSpi.setCurrentConfig(config);
380+
try {
381+
return deserialize(input.getBytes(), typeLiteral);
382+
} finally {
383+
JsoniterSpi.clearCurrentConfig();
384+
}
385+
}
386+
373387
public static final <T> T deserialize(String input, TypeLiteral<T> typeLiteral) {
374388
return deserialize(input.getBytes(), typeLiteral);
375389
}
376390

391+
public static final <T> T deserialize(Config config, byte[] input, Class<T> clazz) {
392+
JsoniterSpi.setCurrentConfig(config);
393+
try {
394+
return deserialize(input, clazz);
395+
} finally {
396+
JsoniterSpi.clearCurrentConfig();
397+
}
398+
}
377399
public static final <T> T deserialize(byte[] input, Class<T> clazz) {
378400
int lastNotSpacePos = findLastNotSpacePos(input);
379401
JsonIterator iter = tlsIter.get();
@@ -391,6 +413,15 @@ public static final <T> T deserialize(byte[] input, Class<T> clazz) {
391413
}
392414
}
393415

416+
public static final <T> T deserialize(Config config, byte[] input, TypeLiteral<T> typeLiteral) {
417+
JsoniterSpi.setCurrentConfig(config);
418+
try {
419+
return deserialize(input, typeLiteral);
420+
} finally {
421+
JsoniterSpi.clearCurrentConfig();
422+
}
423+
}
424+
394425
public static final <T> T deserialize(byte[] input, TypeLiteral<T> typeLiteral) {
395426
int lastNotSpacePos = findLastNotSpacePos(input);
396427
JsonIterator iter = tlsIter.get();
@@ -408,10 +439,28 @@ public static final <T> T deserialize(byte[] input, TypeLiteral<T> typeLiteral)
408439
}
409440
}
410441

442+
public static final Any deserialize(Config config, String input) {
443+
JsoniterSpi.setCurrentConfig(config);
444+
try {
445+
return deserialize(input.getBytes());
446+
} finally {
447+
JsoniterSpi.clearCurrentConfig();
448+
}
449+
}
450+
411451
public static final Any deserialize(String input) {
412452
return deserialize(input.getBytes());
413453
}
414454

455+
public static final Any deserialize(Config config, byte[] input) {
456+
JsoniterSpi.setCurrentConfig(config);
457+
try {
458+
return deserialize(input);
459+
} finally {
460+
JsoniterSpi.clearCurrentConfig();
461+
}
462+
}
463+
415464
public static final Any deserialize(byte[] input) {
416465
int lastNotSpacePos = findLastNotSpacePos(input);
417466
JsonIterator iter = tlsIter.get();
@@ -454,8 +503,4 @@ public static void enableStreamingSupport() {
454503
throw new JsonException(e);
455504
}
456505
}
457-
458-
public static void enableAnnotationSupport() {
459-
JsoniterAnnotationSupport.enable();
460-
}
461506
}

src/main/java/com/jsoniter/annotation/JsoniterAnnotationSupport.java renamed to src/main/java/com/jsoniter/annotation/JsoniterConfig.java

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,51 @@
99
import java.util.Arrays;
1010
import java.util.List;
1111

12-
public class JsoniterAnnotationSupport extends EmptyExtension {
12+
public class JsoniterConfig extends EmptyExtension implements Config {
1313

14-
private static final JsoniterAnnotationSupport INSTANCE = new JsoniterAnnotationSupport();
14+
private final String configName;
15+
private final Builder builder;
1516

16-
public static void enable() {
17-
JsoniterSpi.registerExtension(INSTANCE);
17+
public JsoniterConfig(Builder builder) {
18+
this.configName = JsoniterSpi.assignConfigName(builder);
19+
this.builder = builder;
1820
}
1921

20-
public static void disable() {
21-
JsoniterSpi.deregisterExtension(INSTANCE);
22+
@Override
23+
public String configName() {
24+
return null;
25+
}
26+
27+
protected Builder builder() {
28+
return builder;
29+
}
30+
31+
public static class Builder {
32+
33+
private boolean dummy;
34+
35+
public JsoniterConfig build() {
36+
return new JsoniterConfig(this);
37+
}
38+
39+
@Override
40+
public boolean equals(Object o) {
41+
if (this == o) return true;
42+
if (o == null || getClass() != o.getClass()) return false;
43+
44+
Builder builder = (Builder) o;
45+
46+
return dummy == builder.dummy;
47+
}
48+
49+
@Override
50+
public int hashCode() {
51+
return (dummy ? 1 : 0);
52+
}
2253
}
2354

55+
public static final JsoniterConfig INSTANCE = new Builder().build();
56+
2457
@Override
2558
public void updateClassDescriptor(ClassDescriptor desc) {
2659
JsonObject jsonObject = (JsonObject) desc.clazz.getAnnotation(JsonObject.class);

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

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,22 @@
44
import com.google.gson.annotations.SerializedName;
55
import com.jsoniter.annotation.JsonIgnore;
66
import com.jsoniter.annotation.JsonProperty;
7-
import com.jsoniter.annotation.JsoniterAnnotationSupport;
7+
import com.jsoniter.annotation.JsoniterConfig;
88
import com.jsoniter.spi.*;
99

1010
import java.lang.annotation.Annotation;
1111

12-
public class GsonCompatibilityMode extends JsoniterAnnotationSupport {
13-
14-
private Builder builder;
12+
public class GsonCompatibilityMode extends JsoniterConfig {
1513

1614
private GsonCompatibilityMode(Builder builder) {
17-
this.builder = builder;
15+
super(builder);
16+
}
17+
18+
protected Builder builder() {
19+
return (Builder) super.builder();
1820
}
1921

20-
public static class Builder {
22+
public static class Builder extends JsoniterConfig.Builder {
2123
private boolean excludeFieldsWithoutExposeAnnotation = false;
2224

2325
public Builder excludeFieldsWithoutExposeAnnotation() {
@@ -28,16 +30,24 @@ public Builder excludeFieldsWithoutExposeAnnotation() {
2830
public GsonCompatibilityMode build() {
2931
return new GsonCompatibilityMode(this);
3032
}
31-
}
3233

33-
private final static GsonCompatibilityMode INSTANCE = new GsonCompatibilityMode(new Builder());
34+
@Override
35+
public boolean equals(Object o) {
36+
if (this == o) return true;
37+
if (o == null || getClass() != o.getClass()) return false;
38+
if (!super.equals(o)) return false;
3439

35-
public static void enable() {
36-
JsoniterSpi.registerExtension(INSTANCE);
37-
}
40+
Builder builder = (Builder) o;
41+
42+
return excludeFieldsWithoutExposeAnnotation == builder.excludeFieldsWithoutExposeAnnotation;
43+
}
3844

39-
public static void disable() {
40-
JsoniterSpi.deregisterExtension(INSTANCE);
45+
@Override
46+
public int hashCode() {
47+
int result = super.hashCode();
48+
result = 31 * result + (excludeFieldsWithoutExposeAnnotation ? 1 : 0);
49+
return result;
50+
}
4151
}
4252

4353
@Override
@@ -133,7 +143,7 @@ protected JsonIgnore getJsonIgnore(Annotation[] annotations) {
133143
if (jsoniterObj != null) {
134144
return jsoniterObj;
135145
}
136-
if (builder.excludeFieldsWithoutExposeAnnotation) {
146+
if (builder().excludeFieldsWithoutExposeAnnotation) {
137147
final Expose gsonObj = getAnnotation(
138148
annotations, Expose.class);
139149
if (gsonObj != null) {

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@
99

1010
import java.lang.annotation.Annotation;
1111

12-
public class JacksonCompatibilityMode extends JsoniterAnnotationSupport {
12+
public class JacksonCompatibilityMode extends JsoniterConfig {
1313

14-
private final static JacksonCompatibilityMode INSTANCE = new JacksonCompatibilityMode();
15-
16-
public static void enable() {
17-
JsoniterSpi.registerExtension(INSTANCE);
14+
public static class Builder extends JsoniterConfig.Builder {
15+
public JacksonCompatibilityMode build() {
16+
return new JacksonCompatibilityMode(this);
17+
}
1818
}
1919

20-
public static void disable() {
21-
JsoniterSpi.deregisterExtension(INSTANCE);
20+
private JacksonCompatibilityMode(Builder builder) {
21+
super(builder);
2222
}
2323

2424
@Override

src/main/java/com/jsoniter/output/JsonStream.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package com.jsoniter.output;
22

33
import com.jsoniter.any.Any;
4-
import com.jsoniter.spi.Encoder;
5-
import com.jsoniter.spi.JsonException;
6-
import com.jsoniter.spi.TypeLiteral;
4+
import com.jsoniter.spi.*;
75

86
import java.io.IOException;
97
import java.io.OutputStream;
@@ -343,6 +341,15 @@ protected JsonStream initialValue() {
343341
}
344342
};
345343

344+
public static void serialize(Config config, Object obj, OutputStream out) {
345+
JsoniterSpi.setCurrentConfig(config);
346+
try {
347+
serialize(obj, out);
348+
} finally {
349+
JsoniterSpi.clearCurrentConfig();
350+
}
351+
352+
}
346353
public static void serialize(Object obj, OutputStream out) {
347354
JsonStream stream = tlsStream.get();
348355
try {
@@ -364,6 +371,15 @@ protected AsciiOutputStream initialValue() {
364371
}
365372
};
366373

374+
public static String serialize(Config config, Object obj) {
375+
JsoniterSpi.setCurrentConfig(config);
376+
try {
377+
return serialize(obj);
378+
} finally {
379+
JsoniterSpi.clearCurrentConfig();
380+
}
381+
}
382+
367383
public static String serialize(Object obj) {
368384
AsciiOutputStream asciiOutputStream = tlsAsciiOutputStream.get();
369385
asciiOutputStream.reset();
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.jsoniter.spi;
2+
3+
public interface Config extends Extension {
4+
String configName();
5+
}

0 commit comments

Comments
 (0)