Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6d01183

Browse files
committed
Fixed public api 'public static String serialize(boolean escapeUnicode, Type type, Object obj)' implementation. Fixes #289, #299.
1 parent e84b9c7 commit 6d01183

File tree

4 files changed

+59
-30
lines changed

4 files changed

+59
-30
lines changed

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

Lines changed: 33 additions & 26 deletions
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 1 addition & 0 deletions
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
}
Lines changed: 23 additions & 2 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /