Skip to content

Commit 60cf2b1

Browse files
authored
Merge pull request #308 from json-iterator/289-fixed-escape-unicode-public-api-implementation
Fixed public api 'public static String serialize(boolean escapeUnicod…
2 parents e84b9c7 + 6d01183 commit 60cf2b1

File tree

4 files changed

+59
-30
lines changed

4 files changed

+59
-30
lines changed

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

+33-26
Original file line numberDiff line numberDiff line change
@@ -442,52 +442,59 @@ public static void serialize(TypeLiteral typeLiteral, Object obj, OutputStream o
442442
}
443443

444444
public static void serialize(Type type, Object obj, OutputStream out) {
445-
JsonStream stream = JsonStreamPool.borrowJsonStream();
446-
try {
447-
try {
448-
stream.reset(out);
449-
stream.writeVal(type, obj);
450-
} finally {
451-
stream.close();
452-
}
453-
} catch (IOException e) {
454-
throw new JsonException(e);
455-
} finally {
456-
JsonStreamPool.returnJsonStream(stream);
457-
}
445+
serialize(type, obj, out, false);
458446
}
459447

460448
public static String serialize(Config config, Object obj) {
461-
JsoniterSpi.setCurrentConfig(config);
462-
try {
463-
return serialize(config.escapeUnicode(), obj.getClass(), obj);
464-
} finally {
465-
JsoniterSpi.clearCurrentConfig();
466-
}
449+
return serialize(config, obj.getClass(), obj);
467450
}
468451

469452
public static String serialize(Object obj) {
470-
return serialize(JsoniterSpi.getCurrentConfig().escapeUnicode(), obj.getClass(), obj);
453+
return serialize(obj.getClass(), obj);
471454
}
472455

473456
public static String serialize(Config config, TypeLiteral typeLiteral, Object obj) {
457+
return serialize(config, typeLiteral.getType(), obj);
458+
}
459+
460+
private static String serialize(Config config, Type type, Object obj) {
461+
final Config configBackup = JsoniterSpi.getCurrentConfig();
462+
// Set temporary config
474463
JsoniterSpi.setCurrentConfig(config);
475464
try {
476-
return serialize(config.escapeUnicode(), typeLiteral.getType(), obj);
465+
return serialize(type, obj);
477466
} finally {
478-
JsoniterSpi.clearCurrentConfig();
467+
// Revert old config
468+
JsoniterSpi.setCurrentConfig(configBackup);
479469
}
480470
}
481471

482472
public static String serialize(TypeLiteral typeLiteral, Object obj) {
483-
return serialize(JsoniterSpi.getCurrentConfig().escapeUnicode(), typeLiteral.getType(), obj);
473+
return serialize(typeLiteral.getType(), obj);
484474
}
485475

486476
public static String serialize(boolean escapeUnicode, Type type, Object obj) {
487-
JsonStream stream = JsonStreamPool.borrowJsonStream();
477+
final Config currentConfig = JsoniterSpi.getCurrentConfig();
478+
return serialize(currentConfig.copyBuilder().escapeUnicode(escapeUnicode).build(), type, obj);
479+
}
480+
481+
private static String serialize(Type type, Object obj) {
482+
return serialize(type, obj, null, true);
483+
}
484+
485+
private static String serialize(Type type, Object obj, OutputStream out, boolean returnObjAsString) {
486+
final JsonStream stream = JsonStreamPool.borrowJsonStream();
487+
final boolean escapeUnicode = JsoniterSpi.getCurrentConfig().escapeUnicode();
488488
try {
489-
stream.reset(null);
490-
stream.writeVal(type, obj);
489+
try {
490+
stream.reset(out);
491+
stream.writeVal(type, obj);
492+
} finally {
493+
stream.close();
494+
}
495+
if (!returnObjAsString) {
496+
return "";
497+
}
491498
if (escapeUnicode) {
492499
return new String(stream.buf, 0, stream.count);
493500
} else {

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ private static void writeStringSlowPath(JsonStream stream, String val, int i, in
132132
if (escapeUnicode) {
133133
for (; i < valLen; i++) {
134134
int c = val.charAt(i);
135-
if (c > 125) {
135+
if (c > 127) {
136136
writeAsSlashU(stream, c);
137137
} else {
138138
writeAsciiChar(stream, c);
@@ -147,7 +147,7 @@ private static void writeStringSlowPathWithoutEscapeUnicode(JsonStream stream, S
147147
int _surrogate;
148148
for (; i < valLen; i++) {
149149
int c = val.charAt(i);
150-
if (c > 125) {
150+
if (c > 127) {
151151
if (c < 0x800) { // 2-byte
152152
stream.write(
153153
(byte) (0xc0 | (c >> 6)),

src/main/java/com/jsoniter/spi/JsoniterSpi.java

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public static void setCurrentConfig(Config val) {
4343
currentConfig.set(val);
4444
}
4545

46+
// TODO usage of this method leads to potentially unexpected side effects. All usage should be checked.
4647
public static void clearCurrentConfig() {
4748
currentConfig.set(defaultConfig);
4849
}
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,40 @@
11
package com.jsoniter.output;
22

33
import com.jsoniter.spi.Config;
4+
import com.jsoniter.spi.Config.Builder;
5+
import com.jsoniter.spi.JsoniterSpi;
6+
import java.io.ByteArrayOutputStream;
47
import junit.framework.TestCase;
58

69
public class TestString extends TestCase {
10+
11+
public static final String UTF8_GREETING = "Привет čau 你好 ~";
12+
713
public void test_unicode() {
814
String output = JsonStream.serialize(new Config.Builder().escapeUnicode(false).build(), "中文");
915
assertEquals("\"中文\"", output);
1016
}
1117
public void test_unicode_tilde() {
12-
String output = JsonStream.serialize(new Config.Builder().escapeUnicode(false).build(), "~");
13-
assertEquals("\"~\"", output);
18+
final String tilde = "~";
19+
String output = JsonStream.serialize(new Config.Builder().escapeUnicode(false).build(), tilde);
20+
assertEquals("\""+tilde+"\"", output);
21+
}
22+
public void test_escape_unicode() {
23+
final Config config = new Builder().escapeUnicode(false).build();
24+
25+
assertEquals("\""+UTF8_GREETING+"\"", JsonStream.serialize(config, UTF8_GREETING));
26+
assertEquals("\""+UTF8_GREETING+"\"", JsonStream.serialize(config.escapeUnicode(), UTF8_GREETING.getClass(), UTF8_GREETING));
1427
}
1528
public void test_escape_control_character() {
1629
String output = JsonStream.serialize(new String(new byte[]{0}));
1730
assertEquals("\"\\u0000\"", output);
1831
}
32+
public void test_serialize_into_output_stream() {
33+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
34+
boolean escapeUnicode = JsoniterSpi.getCurrentConfig().escapeUnicode();
35+
JsoniterSpi.setCurrentConfig(JsoniterSpi.getCurrentConfig().copyBuilder().escapeUnicode(false).build());
36+
JsonStream.serialize(String.class, UTF8_GREETING, baos);
37+
JsoniterSpi.setCurrentConfig(JsoniterSpi.getCurrentConfig().copyBuilder().escapeUnicode(escapeUnicode).build());
38+
assertEquals("\"" + UTF8_GREETING + "\"", baos.toString());
39+
}
1940
}

0 commit comments

Comments
 (0)