fastJson 类似 jsoncpp的toStyledString

FastJson是阿里巴巴的Java Json处理工具包,不依赖第三方jar包。

但是它的序列化字符串没indent格式,比如c++ json处理包的toStyledString.

下面就按找c++代码改写Java 一样处理Java json.

class JsonUtil{
public static String printJSONObject(JSONObject obj){
		StringBuffer sb=new StringBuffer();
		printJSONObject(sb,obj,0);
		return sb.toString();
	}
	private static void printJSONObject(StringBuffer sb,JSONObject obj,int indent){
		int size=obj.size();
		if(size == 0){
			sb.append("{}");
		}else{
			sb.append("{\n");
			ArrayList<String> keys=new ArrayList<String>(obj.keySet());
			Collections.sort(keys);
			for(int index=0; index < size; index++){
				if(index>0)
					sb.append(",\n");
				printSpace(sb,indent+4);
				sb.append('"'+keys.get(index)+'"');
				sb.append(" : ");
				printItem(sb,obj.get(keys.get(index)),indent+9+keys.get(index).length());
			}
			sb.append('\n');
			printSpace(sb,indent);
			sb.append('}');
		}
	}
	private static void printItem(StringBuffer sb,Object obj,int indent){
		if(obj instanceof JSONObject){
			printJSONObject(sb,(JSONObject)obj,indent);
		}else if(obj instanceof JSONArray){
			printJSONArray(sb,(JSONArray)obj,indent);
		}else{
			sb.append(JSON.toJSONString(obj));
		}
	}
	private static void printJSONArray(StringBuffer sb,JSONArray obj,int indent){
		int size=obj.size();
		if(size==0){
			sb.append("[]");
		}else{
			boolean flag=size*3>=74;
			for ( int index =0; index < size  &&  !flag; ++index ){
				Object element=obj.get(index);
				flag |= ((element instanceof JSONObject) && ((JSONObject)element).size()>0) || 
						((element instanceof JSONArray) && ((JSONArray)element).size()>0);
			}
			ArrayList<String> childValue=new ArrayList<String>();
			if(!flag){
				int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]'
			    for ( int index =0; index < size; ++index ){
			    	String element=JSON.toJSONString(obj.get(index));
			    	childValue.add(element);
			    	lineLength+=element.length();
			    }
			    flag|=lineLength>=74;
			}
			if(flag){
				sb.append("[\n");
				if(childValue.isEmpty()){
					for(int index =0; index < size; ++index){
						if(index > 0)
							sb.append(",\n");
						printSpace(sb,indent+4);
						printItem(sb,obj.get(index),indent+4);
					}
				}else{
					for(int index =0; index < size; ++index){
						if(index > 0)
							sb.append(",\n");
						printSpace(sb,indent+4);
						sb.append(childValue.get(index));
					}
				}
				sb.append('\n');
				printSpace(sb,indent);
				sb.append(']');
			}else{
				sb.append("[ ");
				for(int index =0; index < size; ++index){
					if(index > 0)
						sb.append(", ");
					sb.append(childValue.get(index));
				}
				sb.append(" ]");
			}
		}	
	}
	private static void printSpace(StringBuffer sb,int indent){
		for(int i=0;i<indent;i++)
			sb.append(" ");
	}
}

效果如下:

{
    "aa" : "this isstring",
    "array1" : [ 1, 6, 8, 9 ],
    "array2" : [
                   "aaaaaaaaaaaaaaaaaaaaa",
                   "bbbbbbbbbbbbbbbbbbbbbbb",
                   "cccccccccccccccc",
                   "dddddddddddddd",
                   "fffffffffffff"
               ]
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值