209 lines
4.3 KiB
Java
209 lines
4.3 KiB
Java
|
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;
|
|||
|
}
|
|||
|
|
|||
|
}
|