package foundation.json; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.net.URLEncoder; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; public class JSONBuilder implements IJSONWriter, IJSONProvider { private StringBuilder writer; private boolean encodeActive; private boolean lowerNameActive; private boolean empty; private boolean nameReady; private String operator; public JSONBuilder() { writer = new StringBuilder(); empty = true; nameReady = false; encodeActive = true; lowerNameActive = true; } 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("\"" + formatName(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("\"" + formatName(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(", "); } writer.append("\"" + formatName(name) + "\": \"" + formatValue(value) + "\""); empty = false; } @Override public void write(String value) { if (!empty) { writer.append(", "); } writer.append("\"" + formatValue(value) + "\""); empty = false; } public void write(String name, Integer value) { if (!empty) { writer.append(", "); } writer.append("\"" + formatName(name) + "\": " + String.valueOf(value)); empty = false; } @Override 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("\"" + formatName(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("\"" + formatName(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("\"" + formatName(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("\"" + formatName(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("\"" + formatName(name) + "\": \"" + value + "\""); empty = false; } public void write(String name, Date value, String fomater) { if (!empty) { writer.append(", "); } if (value == null) { writer.append("\"" + formatName(name) + "\": null"); empty = false; return; } DateFormat dateFormat = new SimpleDateFormat(fomater); String result = dateFormat.format(value); writer.append("\"" + formatName(name) + "\": \"" + result + "\""); 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("\"" + formatName(name) + "\": " + json); } else { writer.append(json); } empty = false; } public void writeNull(String name) { if (!empty) { writer.append(", "); } if (name != null) { writer.append("\"" + formatName(name) + "\": null"); } else { writer.append("null"); } empty = false; nameReady = false; } public void writeName(String name) { if (!empty) { writer.append(", "); } if (name != null) { writer.append("\"" + formatName(name) + "\": "); } nameReady = true; } public void writeValue(String value) { writer.append("\"" + formatValue(value) + "\""); empty = false; nameReady = false; } 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; } public void writeJSON(String json) { if (!empty) { writer.append(", "); } writer.append(json); empty = false; nameReady = false; } private String formatName(String name) { if (name == null) { return "empty"; } if (!lowerNameActive) { return name; } return name.toLowerCase(); } public String formatValue(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() { } public void close() { } public String toString() { return writer.toString(); } public byte[] getBytes() throws UnsupportedEncodingException { String result = toString(); return result.getBytes("UTF-8"); } @Override public void checkEmpty() { if (!empty) { writer.append(", "); } } @Override public String getOperator() { return operator; } public void setOperator(String operator) { this.operator = operator; } public boolean isEncodeActive() { return encodeActive; } public void setEncodeActive(boolean encodeActive) { this.encodeActive = encodeActive; } public boolean isLowerNameActive() { return lowerNameActive; } public void setLowerNameActive(boolean lowerNameActive) { this.lowerNameActive = lowerNameActive; } @Override public void writeJSON(IJSONWriter writer) { writer.writeJSON(this.writer.toString()); } @Override public void write(String name, Object value) { // TODO Auto-generated method stub } }