超精简的json输出类

json,这玩意比较火爆,地球人都知道。网上json的解析包也非常多,然而大部分时候,我们只是需要在服务端输出json格式到客户端,甚至我经常做的是在调试日志里面输出变量的值,所以就自己写了个非常精简的json格式输出包。

package com.kievnsoft.json;
import java.io.IOException;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.Map;

public class JsonObject {
    private static final char[] numbers = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
    private Calendar calendar = Calendar.getInstance();
    private StringBuilder sb = new StringBuilder();
    private boolean dateToText;
    private char[] ints = new char[16];
    public JsonObject(Object value) throws Exception {
        this(value, false);
    }
    public JsonObject(Object value, boolean dateToText) throws Exception {
        super();
        this.dateToText = dateToText;
        makeJson(value);
    }
    @Override
    public String toString() {
        return sb.toString();
    }
    public static String toJson(Object value) throws Exception {
        return toJson(value, false);
    }
    public static String toJson(Object value, boolean dateToText) throws Exception {
        JsonObject jo = new JsonObject(value);
        return jo.toString();
    }
    private void makeJson(Object value) throws Exception {
        if(value == null) {
            sb.append("null");
            return;
        }
       
        if(value instanceof String) {
            jsonString(value.toString());
        }
        else if(value instanceof Number) {
            sb.append(value.toString());
        }
        else if(value instanceof Date) {
            if(!dateToText)
                sb.append(((Date)value).getTime());
            else {
                sb.append('"');
                calendar.setTime((Date)value);
                formatInt(calendar.get(Calendar.YEAR), 4);
                sb.append(ints, 0, 4).append('-');
                formatInt(calendar.get(Calendar.MONTH), 2);
                sb.append(ints, 0, 2).append('-');
                formatInt(calendar.get(Calendar.DAY_OF_MONTH), 2);
                sb.append(ints, 0, 2).append(' ');
                formatInt(calendar.get(Calendar.HOUR_OF_DAY), 2);
                sb.append(ints, 0, 2).append(':');
                formatInt(calendar.get(Calendar.MINUTE), 2);
                sb.append(ints, 0, 2).append(':');
                formatInt(calendar.get(Calendar.SECOND), 2);
                sb.append(ints, 0, 2);
                sb.append('"');
            }
        }
        else if(value instanceof Collection) {
            sb.append('[');
            for(Object o : (Collection)value) {
                makeJson(o);
                sb.append(',');
            }
            sb.setCharAt(sb.length() - 1, ']');
        }
        else if(value instanceof Map) {
            sb.append('{');
            for(Map.Entry v : ((Map)value).entrySet()) {
                makeJson(v.getKey());
                sb.append(':');
                makeJson(v.getValue());
                sb.append(',');
            }
            sb.setCharAt(sb.length() - 1, '}');
        }
        else if(value.getClass().isArray()) {
            sb.append('[');
            int n = Array.getLength(value);
            for(int i = 0; i < n; ++i) {
                makeJson(Array.get(value, i));
                sb.append(',');
            }
            sb.setCharAt(sb.length() - 1, ']');
        }
        else if(value instanceof Boolean) {
            sb.append(value);
        }
        else if(value instanceof Character) {
            jsonString(String.valueOf(value));
        }
        else if(value instanceof Enum) {
            jsonString(((Enum)value).toString());
        }
        else {
            sb.append('{');
            Class cls = value.getClass();
            Method[] ms = cls.getMethods();
            for(Method v : ms) {
                String msn = v.getName();
                if(!msn.startsWith("get")
                        || msn.charAt(3) == '_'
                        || msn.equals("getClass")
                        || v.getParameterTypes().length > 0)
                    continue;
                sb.append(Character.toLowerCase(msn.charAt(3)));
                sb.append(msn, 4, msn.length()).append(':');
                makeJson(v.invoke(value));
                sb.append(',');
            }
            sb.setCharAt(sb.length() - 1, '}');
        }
    }
    private void jsonString(String str) throws IOException {
        char c;
        sb.append('"');
        for(int i = 0; i < str.length(); ++i) {
            c = str.charAt(i);
            switch (c) {
                case '"': sb.append("///""); break;
                case '/'':  sb.append("//'"); break;
                case '//': sb.append(""); break;
                case '/': sb.append("///"); break;
                case '/b': sb.append("//b"); break;
                case '/f': sb.append("//f"); break;
                case '/n': sb.append("//n"); break;
                case '/r': sb.append("//r"); break;
                case '/t': sb.append("//t"); break;
                default: sb.append(c); break;
            }
        }
        sb.append('"');
    }
   
    private void formatInt(int value, int length) {
        for(int i = length - 1; i >= 0; --i) {
            if(value > 0) {
                ints[i] = numbers[value % 10];
                value = value / 10;
            }
            else ints[i] = '0';
        }
    }
}

 

转载于:https://my.oschina.net/kivensoft/blog/549367

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
介绍 JSONLite 是 JSON 的简化版。减少字符输出的同时,仍保持数据有效性。 建议PHP版本 >= 5.2.0 。 特性 Js 兼容模式,兼容Js语法。取消了不必要的双引号。 Strict 强型模式,提供强输出与解析,可用于与强型语言通讯。 如 1.0 序列化和解序列后的型均为 double,不会转换为 int 1。 Min 最小化模式,最小化输出数据,可用于日志打印。 较为精确的错误位置和信息提示。 解析时更为显性的暴漏格式错误 示例代码: $value = array( 'code' => '123', 'msg' => 'true str', 'null' => null, 'new' => '', 'double' => 1.0, ); // serialize // js echo jsonlite_encode($value); // {code:123,msg:"true str","null":0,"new":"",double:1} // min echo jsonlite_encode($value, JSONLITE_MODE_MIN); // {code:123,msg:true str,"null":,new:,double:1} // strict echo jsonlite_encode($value, JSONLITE_MODE_STRICT); // {code:"123",msg:true str,"null":null,new:,double:1.0} // unserialize $jsonlite = '{code:123,msg:true str,"null":null,new:,double:1}'; $value = jsonlite_decode($jsonlite); var_export($value); /** * array ( * 'code' => 123, * 'msg' => 'true str', * 'null' => NULL, * 'new' => '', * 'double' => 1, * ) */ // work with json $value = array( 'code' => '123', 'msg' => 'true str', 'null' => null, 'new' => '', 'double' => 1.0, ); $json = json_encode($value); // ATTENTION:encode with json // {"code":"123","msg":"true str","null":null,"new":"","double":1} $value = jsonlite_decode($json); var_export($value); /** * array ( * 'code' => 123, * 'msg' => 'true str', * 'null' => NULL, * 'new' => '', * 'double' => 1, * ) */ 体积对比 根据测试数据计算,实际情况请另行估算。 模式 JSON JSONLite 变化量 变化率 array_js 92 92 0 0.00% array_strict 92 74 -18 19.57% array_min 92 70 -22 23.91% map_js 111 97 -14 12.61% map_strict 111 83 -28 25.23% map_min 111 81 -30 27.03% 标签:JSONLite 分享 window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "2", "bdMiniList": [], "bdPic": "", "bdStyle": "1", "bdSize": "24" }, "share": {} }; with (document)0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' ~(-new Date() / 36e5)];\r\n \r\n \r\n \r\n \r\n \u8f6f\u4ef6\u9996\u9875\r\n \u8f6f\u4ef6\u4e0b\u8f7d\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\nwindow.changyan.api.config({\r\nappid: 'cysXjLKDf', conf: 'prod_33c27aefa42004c9b2c12a759c851039' });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值