Java json类实例 中文自动转换为unicode

package root.util;

import java.beans.BeanInfo; 
import java.beans.Introspector; 
import java.beans.PropertyDescriptor; 
import java.io.IOException;
import java.lang.reflect.Array; 
import java.lang.reflect.Method; 
import java.text.CharacterIterator; 
import java.text.SimpleDateFormat; 
import java.text.StringCharacterIterator; 
import java.util.Date; 
import java.util.Iterator; 
import java.util.Map; 

import org.apache.struts2.ServletActionContext;
 

/**
 * @author 苏雷
 * 实例:
 * Json json=new Json();
 * 例如:
 * json.append("data",list);
 * 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;
 }
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值