package foundation.json;
|
|
import java.io.PrintWriter;
|
import java.io.UnsupportedEncodingException;
|
import java.math.BigDecimal;
|
import java.net.URLEncoder;
|
import java.util.Date;
|
import java.util.List;
|
|
import foundation.server.config.Configer;
|
import foundation.util.Util;
|
|
public class JSONWriter implements IJSONWriter {
|
|
private static boolean EncodeActive;
|
private PrintWriter writer;
|
private boolean empty;
|
private boolean nameReady;
|
private String operator;
|
|
static {
|
EncodeActive = Configer.getBoolean("EncodeActive", true);
|
}
|
|
public JSONWriter(PrintWriter writer) {
|
this.writer = writer;
|
empty = true;
|
nameReady = false;
|
}
|
|
public void beginObject() {
|
if (!nameReady && !empty) {
|
writer.append(", ");
|
}
|
|
writer.append("{");
|
empty = true;
|
nameReady = false;
|
}
|
|
public void beginObject(String name) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
if (name != null) {
|
writer.append("\"" + toLower(name) + "\": {");
|
}
|
else {
|
writer.append("{");
|
}
|
|
empty = true;
|
}
|
|
public void endObject() {
|
writer.append("}");
|
empty = false;
|
nameReady = false;
|
}
|
|
public void beginArray() {
|
if (!nameReady && !empty) {
|
writer.append(", ");
|
}
|
|
writer.append("[");
|
empty = true;
|
nameReady = false;
|
}
|
|
public void beginArray(String name) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
if (name != null) {
|
writer.append("\"" + toLower(name) + "\": [");
|
}
|
else {
|
writer.append("[");
|
}
|
|
empty = true;
|
nameReady = false;
|
}
|
|
public void endArray() {
|
writer.append("]");
|
empty = false;
|
nameReady = false;
|
}
|
|
public void write(String name, String value) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
//@he
|
if (Util.isEmpty(name)) {
|
writer.append(" \"" + encodeValue(value) + "\"");
|
}
|
else {
|
writer.append("\"" + toLower(name) + "\": \"" + encodeValue(value) + "\"");
|
}
|
|
empty = false;
|
}
|
|
public void write(String value) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
writer.append("\"" + encodeValue(value) + "\"");
|
empty = false;
|
}
|
|
public void write(String name, Integer value) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
writer.append("\"" + toLower(name) + "\": " + String.valueOf(value));
|
empty = false;
|
}
|
|
@Override
|
public void write(String name, Object value) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
writer.append("\"" + toLower(name) + "\": " + value);
|
empty = false;
|
}
|
|
public void write(Integer value) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
writer.append(String.valueOf(value));
|
empty = false;
|
}
|
|
public void write(String name, Double value) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
writer.append("\"" + toLower(name) + "\": " + String.valueOf(value));
|
empty = false;
|
}
|
|
@Override
|
public void write(Double value) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
writer.append(String.valueOf(value));
|
empty = false;
|
}
|
|
public void write(String name, Long value) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
writer.append("\"" + toLower(name) + "\": " + String.valueOf(value));
|
empty = false;
|
}
|
|
@Override
|
public void write(Long value) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
writer.append(String.valueOf(value));
|
empty = false;
|
}
|
|
public void write(String name, BigDecimal value) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
writer.append("\"" + toLower(name) + "\": " + String.valueOf(value));
|
empty = false;
|
}
|
|
@Override
|
public void write(BigDecimal value) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
writer.append(String.valueOf(value));
|
empty = false;
|
}
|
|
public void write(String name, boolean value) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
writer.append("\"" + toLower(name) + "\": " + (value ? "true" : "false"));
|
empty = false;
|
}
|
|
@Override
|
public void write(boolean value) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
writer.append((value ? "true" : "false"));
|
empty = false;
|
}
|
|
public void write(String name, Date value) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
writer.append("\"" + toLower(name) + "\": \"" + value + "\"");
|
empty = false;
|
}
|
|
@Override
|
public void write(Date value) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
writer.append("\"" + value + "\"");
|
empty = false;
|
}
|
|
public void write(String name, IJSONProvider jsonProvider) {
|
writeName(name);
|
|
if (jsonProvider == null) {
|
writeNull();
|
return;
|
}
|
|
jsonProvider.writeJSON(this);
|
}
|
|
public void write(String name, List<? extends IJSONProvider> list) {
|
writeName(name);
|
|
if (list == null) {
|
writeNull();
|
return;
|
}
|
|
beginArray();
|
|
for (IJSONProvider json: list) {
|
json.writeJSON(this);
|
}
|
|
endArray();
|
}
|
|
public void write(IJSONProvider jsonProvider) {
|
if (jsonProvider == null) {
|
writeNull();
|
return;
|
}
|
|
jsonProvider.writeJSON(this);
|
}
|
|
public void writeJSON(String name, String json) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
if (name != null) {
|
writer.append("\"" + toLower(name) + "\": " + json);
|
}
|
else {
|
writer.append(json);
|
}
|
|
empty = false;
|
}
|
|
public void writeJSON(String json) {
|
writer.append(json);
|
empty = false;
|
nameReady = false;
|
}
|
|
public void writeNull(String name) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
if (name != null) {
|
writer.append("\"" + toLower(name) + "\": null");
|
}
|
else {
|
writer.append("null");
|
}
|
|
empty = false;
|
nameReady = false;
|
}
|
|
public void writeName(String name) {
|
if (!empty) {
|
writer.append(", ");
|
}
|
|
if (name != null) {
|
writer.append("\"" + toLower(name) + "\": ");
|
}
|
|
nameReady = true;
|
}
|
|
public void writeValue(String value) {
|
writer.append("\"" + encodeValue(value) + "\"");
|
empty = false;
|
nameReady = false;
|
}
|
|
@Override
|
public void checkEmpty() {
|
if (!empty) {
|
writer.append(", ");
|
}
|
}
|
|
public void writeValue(int value) {
|
writer.append(String.valueOf(value));
|
empty = false;
|
nameReady = false;
|
}
|
|
public void writeValue(BigDecimal value) {
|
writer.append(String.valueOf(value));
|
empty = false;
|
nameReady = false;
|
}
|
|
public void writeValue(boolean value) {
|
writer.append(value ? "true" : "false");
|
empty = false;
|
nameReady = false;
|
}
|
|
public void writeValue(Date value) {
|
writer.append("\"" + value + "\"");
|
empty = false;
|
nameReady = false;
|
}
|
|
public void writeNull() {
|
writer.append("null");
|
empty = false;
|
nameReady = false;
|
}
|
|
private String toLower(String name) {
|
if (name == null) {
|
return "empty";
|
}
|
|
return name.toLowerCase();
|
}
|
|
public static String encodeValue(String value) {
|
String result = "";
|
|
if (value == null) {
|
return result;
|
}
|
|
if (!EncodeActive) {
|
return value;
|
}
|
|
try {
|
result = URLEncoder.encode(value, "UTF-8");
|
result = result.replace("+", "%20");
|
}
|
catch (Exception e) {
|
result = value;
|
}
|
|
return result;
|
}
|
|
public void flush() {
|
writer.flush();
|
}
|
|
public void close() {
|
writer.close();
|
}
|
|
public static void main(String[] args) throws UnsupportedEncodingException {
|
String value = "good good";
|
System.out.println(URLEncoder.encode(value, "UTF-8"));
|
}
|
|
@Override
|
public String getOperator() {
|
return operator;
|
}
|
|
public void setOperator(String operator) {
|
this.operator = operator;
|
}
|
|
}
|