Skip to content

Commit

Permalink
Fixed public api 'public static String serialize(boolean escapeUnicod…
Browse files Browse the repository at this point in the history
…e, Type type, Object obj)' implementation. Fixes #289, #299.
  • Loading branch information
svobol13 committed Jan 23, 2022
1 parent e84b9c7 commit 6d01183
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 30 deletions.
59 changes: 33 additions & 26 deletions src/main/java/com/jsoniter/output/JsonStream.java
Original file line number Diff line number Diff line change
Expand Up @@ -442,52 +442,59 @@ public static void serialize(TypeLiteral typeLiteral, Object obj, OutputStream o
}

public static void serialize(Type type, Object obj, OutputStream out) {
JsonStream stream = JsonStreamPool.borrowJsonStream();
try {
try {
stream.reset(out);
stream.writeVal(type, obj);
} finally {
stream.close();
}
} catch (IOException e) {
throw new JsonException(e);
} finally {
JsonStreamPool.returnJsonStream(stream);
}
serialize(type, obj, out, false);
}

public static String serialize(Config config, Object obj) {
JsoniterSpi.setCurrentConfig(config);
try {
return serialize(config.escapeUnicode(), obj.getClass(), obj);
} finally {
JsoniterSpi.clearCurrentConfig();
}
return serialize(config, obj.getClass(), obj);
}

public static String serialize(Object obj) {
return serialize(JsoniterSpi.getCurrentConfig().escapeUnicode(), obj.getClass(), obj);
return serialize(obj.getClass(), obj);
}

public static String serialize(Config config, TypeLiteral typeLiteral, Object obj) {
return serialize(config, typeLiteral.getType(), obj);
}

private static String serialize(Config config, Type type, Object obj) {
final Config configBackup = JsoniterSpi.getCurrentConfig();
// Set temporary config
JsoniterSpi.setCurrentConfig(config);
try {
return serialize(config.escapeUnicode(), typeLiteral.getType(), obj);
return serialize(type, obj);
} finally {
JsoniterSpi.clearCurrentConfig();
// Revert old config
JsoniterSpi.setCurrentConfig(configBackup);
}
}

public static String serialize(TypeLiteral typeLiteral, Object obj) {
return serialize(JsoniterSpi.getCurrentConfig().escapeUnicode(), typeLiteral.getType(), obj);
return serialize(typeLiteral.getType(), obj);
}

public static String serialize(boolean escapeUnicode, Type type, Object obj) {
JsonStream stream = JsonStreamPool.borrowJsonStream();
final Config currentConfig = JsoniterSpi.getCurrentConfig();
return serialize(currentConfig.copyBuilder().escapeUnicode(escapeUnicode).build(), type, obj);
}

private static String serialize(Type type, Object obj) {
return serialize(type, obj, null, true);
}

private static String serialize(Type type, Object obj, OutputStream out, boolean returnObjAsString) {
final JsonStream stream = JsonStreamPool.borrowJsonStream();
final boolean escapeUnicode = JsoniterSpi.getCurrentConfig().escapeUnicode();
try {
stream.reset(null);
stream.writeVal(type, obj);
try {
stream.reset(out);
stream.writeVal(type, obj);
} finally {
stream.close();
}
if (!returnObjAsString) {
return "";
}
if (escapeUnicode) {
return new String(stream.buf, 0, stream.count);
} else {
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/jsoniter/output/StreamImplString.java
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ private static void writeStringSlowPath(JsonStream stream, String val, int i, in
if (escapeUnicode) {
for (; i < valLen; i++) {
int c = val.charAt(i);
if (c > 125) {
if (c > 127) {
writeAsSlashU(stream, c);
} else {
writeAsciiChar(stream, c);
Expand All @@ -147,7 +147,7 @@ private static void writeStringSlowPathWithoutEscapeUnicode(JsonStream stream, S
int _surrogate;
for (; i < valLen; i++) {
int c = val.charAt(i);
if (c > 125) {
if (c > 127) {
if (c < 0x800) { // 2-byte
stream.write(
(byte) (0xc0 | (c >> 6)),
Expand Down
1 change: 1 addition & 0 deletions src/main/java/com/jsoniter/spi/JsoniterSpi.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public static void setCurrentConfig(Config val) {
currentConfig.set(val);
}

// TODO usage of this method leads to potentially unexpected side effects. All usage should be checked.
public static void clearCurrentConfig() {
currentConfig.set(defaultConfig);
}
Expand Down
25 changes: 23 additions & 2 deletions src/test/java/com/jsoniter/output/TestString.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,40 @@
package com.jsoniter.output;

import com.jsoniter.spi.Config;
import com.jsoniter.spi.Config.Builder;
import com.jsoniter.spi.JsoniterSpi;
import java.io.ByteArrayOutputStream;
import junit.framework.TestCase;

public class TestString extends TestCase {

public static final String UTF8_GREETING = "Привет čau 你好 ~";

public void test_unicode() {
String output = JsonStream.serialize(new Config.Builder().escapeUnicode(false).build(), "中文");
assertEquals("\"中文\"", output);
}
public void test_unicode_tilde() {
String output = JsonStream.serialize(new Config.Builder().escapeUnicode(false).build(), "~");
assertEquals("\"~\"", output);
final String tilde = "~";
String output = JsonStream.serialize(new Config.Builder().escapeUnicode(false).build(), tilde);
assertEquals("\""+tilde+"\"", output);
}
public void test_escape_unicode() {
final Config config = new Builder().escapeUnicode(false).build();

assertEquals("\""+UTF8_GREETING+"\"", JsonStream.serialize(config, UTF8_GREETING));
assertEquals("\""+UTF8_GREETING+"\"", JsonStream.serialize(config.escapeUnicode(), UTF8_GREETING.getClass(), UTF8_GREETING));
}
public void test_escape_control_character() {
String output = JsonStream.serialize(new String(new byte[]{0}));
assertEquals("\"\\u0000\"", output);
}
public void test_serialize_into_output_stream() {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
boolean escapeUnicode = JsoniterSpi.getCurrentConfig().escapeUnicode();
JsoniterSpi.setCurrentConfig(JsoniterSpi.getCurrentConfig().copyBuilder().escapeUnicode(false).build());
JsonStream.serialize(String.class, UTF8_GREETING, baos);
JsoniterSpi.setCurrentConfig(JsoniterSpi.getCurrentConfig().copyBuilder().escapeUnicode(escapeUnicode).build());
assertEquals("\"" + UTF8_GREETING + "\"", baos.toString());
}
}

0 comments on commit 6d01183

Please sign in to comment.