package root.util;
imp
imp
imp
imp
imp
imp
imp
imp
imp
imp
imp
imp
imp
/**
* @author 苏雷
* 实例:
* Json json=new Json();
* 例如:
* json.append("da
* json.append("state","1");
* json.write();
* 或者
* Json json=new Json();
* json.write("success");此方法会直接输出名为info值为success
* 如果外部是用getJSON方式提交,需要设置callback,使用为json.setCallback("abc")
*/
public class Json {
static char[] hex = "0123456789ABCDEF".toCharArray();
private StringBuffer buf = new StringBuffer();
private String callback=null;
public void write(){
try {
if(callback!=null){
buf.insert(0,callback+"({");
}else{
buf.insert(0,"{");
}
if(callback!=null){
buf.append("})");
}else{
buf.append("}");
}
ServletActionContext.getResponse().getWriter().write(buf.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
public void write(Object object){
append(object);
write();
}
public void write(int i){
append(new Integer(i));
write();
}
public void write(long n) {
append(new Long(n));
write();
}
public void write(double d) {
append(new Double(d));
write();
}
public void write(char c) {
append(new Character(c));
write();
}
public void write(String s){
append(new String(s));
write();
}
public void write(boolean b) {
append(Boolean.valueOf(b));
write();
}
/**
* 添加值到字符串并自动添加Json名[info]
* @param object
*/
private void append(Object object){
buf.delete(0, buf.length());//清空字符串
buf.append("\"info\":");
value(object);
}
public void append(String s,Object object){
if(!buf.toString().equals("")){
buf.append(",");
}
buf.append("\""+s+"\":");
value(object);
}
/**
* 判断数据类型并添加到Json串
* @param object
*/
private void value(Object object) {
if (object == null) {
add("null");
} else if (object instanceof Class) {
string(object);
} else if (object instanceof Boolean) {
bool(((Boolean) object).booleanValue());
} else if (object instanceof Number) {
add(object);
} else if (object instanceof String) {
string(object);
} else if (object instanceof Character) {
string(object);
} else if (object instanceof java.util.Date) {
date(object);
} else if (object instanceof java.sql.Date) {
sqldate(object);
} else if (object instanceof java.sql.Time) {
sqltime(object);
} else if (object instanceof java.sql.Timestamp) {
date(object);
} else if (object instanceof Map) {
map((Map) object);
} else if (object.getClass().isArray()) {
array(object);
} else if (object instanceof Iterable) {
array(((Iterable) object).iterator());
} else {
bean(object);
}
}
private void bean(Object object) {
try {
Method m = object.getClass().getMethod("toJSONString");
Object value = m.invoke(object, (Object[]) null);
add(value);
return;
} catch (Exception e){// No such method or error
}
add("{");
BeanInfo info;
try {
info = Introspector.getBeanInfo(object.getClass());
PropertyDescriptor[] props = info.getPropertyDescriptors();
for (int i = 0; i < props.length; ++i) {
PropertyDescriptor prop = props[i];
String name = prop.getName();
if (name.compareTo("class") == 0) {
continue;
}
Method accessor = prop.getReadMethod();
if (accessor != null) {
Object value = accessor.invoke(object, (Object[]) null);
add(name, value);
}
if ((i == props.length - 2) && (props[i + 1].getName().compareTo("class") == 0)) {
continue;
}
if (i < props.length - 1) {
add(',');
}
}
} catch (Exception e) {
e.printStackTrace();
}
add("}");
}
/**
* 添加键值对到Json串
* @param name
* @param value
*/
private void add(String name, Object value) {
add('"');
add(name);
add("\":");
value(value);
}
private void map(Map map) {
add("{");
Iterator it = map.keySet().iterator();
while (it.hasNext()) {
Object key = it.next();
value(key);
add(":");
value(map.get(key));
if (it.hasNext()) {
add(",");
}
}
add("}");
}
private void array(Iterator it) {
add("[");
while (it.hasNext()) {
value(it.next());
if (it.hasNext()) {
add(",");
}
}
add("]");
}
private void array(Object object) {
add("[");
int length = Array.getLength(object);
for (int i = 0; i < length; ++i) {
value(Array.get(object, i));
if (i < length - 1) {
add(',');
}
}
add("]");
}
private void bool(boolean b) {
add(b? "true": "false");
}
private void date(Object obj) {
add('"');
add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format((Date) obj));
add('"');
}
private void sqldate(Object obj) {
add('"');
add(new SimpleDateFormat("yyyy-MM-dd").format((Date) obj));
add('"');
}
private void sqltime(Object obj) {
add('"');
add(new SimpleDateFormat("HH:mm:ss.SSS").format((Date) obj));
add('"');
}
private void string(Object obj) {
add('"');
CharacterIterator it = new StringCharacterIterator(obj.toString());
for (char c = it.first(); c != CharacterIterator.DONE; c = it.next()) {
if (c == '"') {
add("\\\"");
} else if (c == '\\') {
add("\\\\");
} else if (c == '/') {
add("\\/");
} else if (c == '\b') {
add("\\b");
} else if (c == '\f') {
add("\\f");
} else if (c == '\n') {
add("\\n");
} else if (c == '\r') {
add("\\r");
} else if (c == '\t') {
add("\\t");
} else if (c > 0xff) {
unicode(c);
} else {
add(c);
}
}
add('"');
}
private void add(Object obj) {
buf.append(obj);
}
private void add(char c) {
buf.append(c);
}
private void unicode(char c) {
add("\\u");
int n = c;
for (int i = 0; i < 4; ++i) {
int digit = (n & 0xf000) >> 12;
add(hex[digit]);
n <<= 4;
}
}
public void setCallback(String callback) {
this.callback = callback;
}
public String getCallback() {
return callback;
}
}