Skip to content

Fixed public api 'public static String serialize(boolean escapeUnicod… #308

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 23, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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());
}
}