返回顶部

收藏

java to json

更多
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

@SuppressWarnings("rawtypes")
public class JsonUtil {
    /** 增加需要额外处理的对象toString */
    public Map<Class,JsonCastable> jsonCast = new HashMap<Class, JsonCastable>();

    /**
     * 根据参数类型 路由 获取 返回值字符串
     * @param o 待操作参数可以是 String:将直接进行特殊字符的replace; Number或者boolean:直接输出; 否则调用toJson
     * @return {String} json字符串
     */
    @SuppressWarnings("unchecked")
    public String toJson(Object o){
        if(null == o){
            return null;
        }else if(jsonCast.containsKey(o.getClass())){
            return toJson( jsonCast.get(o.getClass()).cast(o) );
        }else if(o instanceof String){
            return "\\"" + ((String)o).replaceAll("\\"", "\\\\\\\\\\"").replaceAll("[\\n\\r]", "\\\\\\\\n").replaceAll("[\\\\s]+", " ") + "\\"";    // ① 双引号 replaceTo \\" ; ②换行 replaceTo \\n; ③多个空白 replaceTo 1个
        }else if(o instanceof Number || o instanceof Boolean){
            return o.toString();
        }else if( o instanceof Iterable ){
            return listToJson((Iterable<Object>) o);
        }else if( o instanceof Object[] ){
            return arrayToJson((Object[]) o);
        }else if( o instanceof Map){
            return mapToJson((Map<Object, Object>) o);
        }else{
            return ( o instanceof NeedToJson ) ? toJson(toMap(o)) : toJson(o.toString());   // NeedToJson 用来标示 在递归展开的时候需要展现的对象
        }
    }

    /**
     * 处理Map型数据
     * @param m
     * @return
     */
    private String mapToJson(Map<Object,Object> m){
        StringBuffer sb = new StringBuffer();
        sb.append("{");
        for (Map.Entry<Object, Object> e : m.entrySet()) {
            String key = e.getKey().toString().replaceAll("[\\\\W]", "");
            if(key.length()>0 && key.charAt(0)>='0' && key.charAt(0) <= '9'){
                throw new RuntimeException("json-key不要以数字开头");
            }
            sb.append("\\"" + key + "\\":");
            sb.append(toJson(e.getValue()));
            sb.append(",");
        }
        if( sb.lastIndexOf(",") == sb.length()-1 ){
            sb.deleteCharAt(sb.length()-1);
        }
        sb.append("}");
        return sb.toString();
    }

    /**
     * 处理集合型数据
     * @param list
     * @return
     */
    private String listToJson(Iterable<Object> list){
        StringBuffer sb = new StringBuffer();
        sb.append("[");
        for (Object o : list) {
            sb.append( toJson(o) );
            sb.append(",");
        }
        if( sb.lastIndexOf(",") == sb.length()-1 ){
            sb.deleteCharAt(sb.length()-1);
        }
        sb.append("]");
        return sb.toString();
    }

    /**
     * 处理数组型数据
     * @param list
     * @return
     */
    private String arrayToJson(Object[] list){
        StringBuffer sb = new StringBuffer();
        sb.append("[");
        for (Object o : list) {
            sb.append( toJson(o) );
            sb.append(",");
        }
        if( sb.lastIndexOf(",") == sb.length()-1 ){
            sb.deleteCharAt(sb.length()-1);
        }
        sb.append("]");
        return sb.toString();
    }

    /**
     * 对象转换为 Map   根据field的get方法
     * @param o   不得为null
     * @return
     */
    public Map<String, Object> toMap(Object o){
        Map<String, Object> map = new HashMap<String, Object>();
        Class<?> clazz = o.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            String s = field.getName();
            Class<?> c = field.getType();
            String methodName = ( Boolean.TYPE.equals(c)  ? "is" : "get") +s.substring(0,1).toUpperCase()+s.substring(1);
            try {
                Method method = clazz.getMethod(methodName);
                Object result = method.invoke(o);
                map.put(s,result);
            } catch (Exception e) {

            }
        }
        return map;
    }

    /**
     * 仅用作标记是否对普通java对象根据field的get方法toMap 然后再 toJSON
     */
    public interface NeedToJson{}
    /** 增加需要额外处理的对象toString */
    public interface JsonCastable<T>{
        String cast(T o);
    }
}

/****************************************************华丽丽的分界线*************************************************************/
public class Person implements JsonUtil.NeedToJson{
    private String name = "shy2850";
    private Integer age = 1002002939;
    private Date birth = new Date();
    private Boolean male = false;
    private Person[] friends;
    private double amt = 017827038920843099384920934892d;
    private byte b = 24;
    private char c = 'n';
    private BigDecimal bd = new BigDecimal(142424232353.83838d);
    /**getFuns**/
}

public class Test {
    public static void main(String[] args) {
        JsonUtil util = new JsonUtil();
        util.jsonCast.put(Date.class, new JsonCastable<Date>() {
            public String cast(Date o) {
                return null == o ? null : new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(o);
            }
        });
        Person person = new Person();
        String result = util.toJson(person);
        System.out.println(result);
    }
}
//该片段来自于http://outofmemory.cn

标签:java,基础

收藏

0人收藏

支持

0

反对

0

相关聚客文章
  1. 郑 旭东 发表 2014-01-16 16:46:51 JAVA多线程和并发基础面试问答
  2. Terry Zhang 发表 2014-04-17 15:27:06 [正则] 字符类型
  3. Terry Zhang 发表 2014-04-27 10:43:29 [集合框架] 接口
  4. 逍遥冲 发表 2013-12-05 05:53:28 [引]Java NIO —- IO复用
  5. Terry Zhang 发表 2014-04-18 05:08:52 [NIO.2] 编写一个文件拷贝应用
  6. Terry Zhang 发表 2014-04-24 08:14:18 [正则] 边界匹配器
  7. Terry Zhang 发表 2014-05-03 06:33:32 [集合框架] List 接口
  8. Terry Zhang 发表 2014-05-13 06:05:01 [集合框架] SortedSet 接口
  9. 逍遥冲 发表 2013-12-30 14:13:10 [引]编译器自举和移植
  10. 糖果 发表 2015-08-03 21:33:22 逆向基础(十三) JAVA (四)
  11. 博主 发表 2013-03-12 14:17:00 Java基础学习之Enum
  12. Terry Zhang 发表 2014-04-18 05:19:53 [NIO.2] 编写一个文件移动应用