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 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; } }