package ir.xweb.data;
import ir.xweb.util.MimeType;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.io.Writer;
import java.util.Collection;
import java.util.Map;
public class JsonFormatter implements Formatter {
private final String mimeType = MimeType.get("json");
@Override
public void write(final Writer writer, final Object object) throws IOException {
try {
if(object instanceof Map) {
JSONObject obj = (JSONObject) write(object);
obj.write(writer);
writer.flush();
} else {
JSONArray array = (JSONArray) write(object);
array.write(writer);
writer.flush();
}
} catch (JSONException ex) {
throw new IOException(ex);
}
}
protected Object write(final Object object) throws JSONException {
if(object instanceof Map) {
final JSONObject json = new JSONObject();
final Map<?, ?> map = (Map<?, ?>) object;
for (Map.Entry<?, ?> e:map.entrySet()) {
json.put(e.getKey().toString(), write(e.getValue()));
}
return json;
} else if (object instanceof Collection) {
final JSONArray array = new JSONArray();
final Collection<?> list = (Collection<?>) object;
for (Object o:list) {
array.put(write(o));
}
return array;
}
return object;
}
/**
* {@inheritDoc}
*/
@Override
public String getContentType() {
return mimeType;
}
}