package foundation.json; import java.util.List; import java.util.Set; import org.json.JSONArray; import org.json.JSONObject; import foundation.util.Util; public abstract class JSONReader implements Iterable, IJSONProvider{ protected String name; protected JType type; public abstract boolean isEmpty(); public abstract boolean hasChildren(); public abstract boolean has(String name); public abstract JType getType(String name); public abstract Object getValue(); public abstract Object getValue(String name); public abstract Object getValue(String name, Object defaultValue); public abstract String getRawString(String name); public abstract String getString(String name); public abstract String getString(String name, String defaultValue); public abstract String getDecodeString(String name); public abstract String getDecodeString(String name, String defaultValue); public abstract Set getStringSet(); public abstract List getStringList(); public abstract Set getStringSet(String name); public abstract List getStringList(String name); public abstract Integer getInteger(Integer defaultValue); public abstract Integer getInteger(String name, Integer defaultValue); public abstract boolean getBoolean(boolean defaultValue); public abstract boolean getBoolean(String name, boolean defaultValue); public abstract T getReader(String name, JType type); public void put(String name, Object value) { if (value instanceof JSONReader) { putReader(name, (JSONReader)value); return; } JType type = JType.getInstance(value); if (JType.Array == type) { JArrayReader reader = new JArrayReader(name, (JSONArray)value); putReader(name, reader); } else if (JType.Object == type) { JObjectReader reader = new JObjectReader(name, (JSONObject)value); putReader(name, reader); } else { putValue(name, value); } } protected abstract void putReader(String name, JSONReader reader); protected abstract void putValue(String name, Object value); protected abstract void putValue(Object value); public String getName() { return name; } public JType getType() { return type; } public static JType readType(String content) { if (Util.isEmpty(content)) { return JType.Empty; } int max = content.length(); for (int i = 0; i < max; i++) { char c = content.charAt(i); if (' ' == c) { continue; } else if ('{' == c) { return JType.Object; } else if ('[' == c) { return JType.Array; } else { return JType.Unknown; } } return JType.Unknown; } public void writeJSON(IJSONWriter writer) { if (JType.Array == type) { JSONArray jsonArray = (JSONArray)getValue(name); writer.beginArray(name); for(Object json: jsonArray) { JSONReader jsonReader = (JSONReader)json; jsonReader.writeJSON(writer); } writer.endArray(); } else if (JType.Object == type) { writer.beginObject(name); JSONReader jsonReader = (JSONReader)getValue(name); jsonReader.writeJSON(writer); writer.endObject(); } else { writer.write(name, getString(name)); } } }