GsonAgent/src/main/java/cn/citycraft/GsonAgent/nms/stream/JsonWriterHandle.java

209 lines
4.3 KiB
Java
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package cn.citycraft.GsonAgent.nms.stream;
import java.io.IOException;
import java.io.Writer;
import java.lang.reflect.Field;
import net.minecraft.util.com.google.gson.stream.JsonWriter;
public class JsonWriterHandle implements cn.citycraft.GsonAgent.api.stream.JsonWriter {
private static String[] REPLACEMENT_CHARS;
private static String[] HTML_SAFE_REPLACEMENT_CHARS;
static {
try {
Field field = JsonWriter.class.getDeclaredField("REPLACEMENT_CHARS");
field.setAccessible(true);
REPLACEMENT_CHARS = (String[]) field.get(null);
field = JsonWriter.class.getDeclaredField("HTML_SAFE_REPLACEMENT_CHARS");
field.setAccessible(true);
HTML_SAFE_REPLACEMENT_CHARS = (String[]) field.get(null);
} catch (final Exception e) {
e.printStackTrace();
}
}
private final JsonWriter handle;
private Writer out;
private boolean withoutQuotes = false;
public JsonWriterHandle(final Writer out) {
this(new JsonWriter(out));
this.out = out;
}
protected JsonWriterHandle(final JsonWriter handle) {
this.handle = handle;
}
@Override
public JsonWriterHandle beginArray() throws IOException {
getHandle().beginArray();
return this;
}
@Override
public JsonWriterHandle beginObject() throws IOException {
getHandle().beginObject();
return this;
}
@Override
public void close() throws IOException {
getHandle().close();
}
@Override
public JsonWriterHandle endArray() throws IOException {
getHandle().endArray();
return this;
}
@Override
public JsonWriterHandle endObject() throws IOException {
getHandle().endObject();
return this;
}
@Override
public void flush() throws IOException {
getHandle().flush();
}
public JsonWriter getHandle() {
return handle;
}
@Override
public boolean getSerializeNulls() {
return getHandle().getSerializeNulls();
}
@Override
public boolean isHtmlSafe() {
return getHandle().isHtmlSafe();
}
@Override
public boolean isLenient() {
return getHandle().isLenient();
}
@Override
public JsonWriterHandle name(final String name) throws IOException {
getHandle().name(name);
withoutQuotes = false;
return this;
}
@Override
public JsonWriterHandle nameWithoutQuotes(final String name) throws IOException {
getHandle().name(name);
withoutQuotes = true;
return this;
}
@Override
public JsonWriterHandle nullValue() throws IOException {
getHandle().nullValue();
return this;
}
@Override
public void setHtmlSafe(final boolean htmlSafe) {
getHandle().setHtmlSafe(htmlSafe);
}
@Override
public void setIndent(final String indent) {
getHandle().setIndent(indent);
}
@Override
public void setLenient(final boolean lenient) {
getHandle().setLenient(lenient);
}
@Override
public void setSerializeNulls(final boolean serializeNulls) {
getHandle().setSerializeNulls(serializeNulls);
}
@Override
public void string(final String value) throws IOException {
final String[] replacements = getHandle().isHtmlSafe() ? HTML_SAFE_REPLACEMENT_CHARS : REPLACEMENT_CHARS;
if (!this.withoutQuotes) {
this.out.write("\"");
}
int last = 0;
final int length = value.length();
for (int i = 0; i < length; i++) {
final char c = value.charAt(i);
String replacement;
if (c < '€') {
replacement = replacements[c];
if (replacement == null) {
continue;
}
} else {
if (c == '') {
replacement = "\\u2028";
} else {
if (c != '') {
continue;
}
replacement = "\\u2029";
}
}
if (last < i) {
this.out.write(value, last, i - last);
}
this.out.write(replacement);
last = i + 1;
}
if (last < length) {
this.out.write(value, last, length - last);
}
if (!this.withoutQuotes) {
this.out.write("\"");
}
withoutQuotes = false;
}
@Override
public JsonWriterHandle value(final boolean value) throws IOException {
getHandle().value(value);
return this;
}
@Override
public JsonWriterHandle value(final double value) throws IOException {
getHandle().value(value);
return this;
}
@Override
public JsonWriterHandle value(final long value) throws IOException {
getHandle().value(value);
return this;
}
@Override
public JsonWriterHandle value(final Number value) throws IOException {
getHandle().value(value);
return this;
}
@Override
public JsonWriterHandle value(final String value) throws IOException {
getHandle().value(value);
return this;
}
}