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"
]
}