算法

使用算法如下:

对输入字符串,逐个字符的遍历

1、获取当前字符。

2、如果当前字符是前方括号、前花括号做如下处理:


  • 如果前面还有字符,并且字符为“:”,打印:换行和缩进字符字符串。
  • 打印:当前字符。
  • 前方括号、前花括号,的后面必须换行。打印:换行。
  • 每出现一次前方括号、前花括号;缩进次数增加一次。打印:新行缩进。
  • 进行下一次循环。


3、如果当前字符是后方括号、后花括号做如下处理:


  • 后方括号、后花括号,的前面必须换行。打印:换行。
  • 每出现一次后方括号、后花括号;缩进次数减少一次。打印:缩进。
  • 打印:当前字符。
  • 如果当前字符后面还有字符,并且字符不为“,”,打印:换行。
  • 继续下一次循环。


4、如果当前字符是逗号。逗号后面换行,并缩进,不改变缩进次数。


  • 这里有bug,更改为【并且当前字符后方是双引号或左大括号】


5、打印:当前字符。









代码

package  com.bqt.http.utils;


public class JsonFormatTool {

//单位缩进字符串。

private static String SPACE = "   ";


/** 

     * 返回格式化JSON字符串。 

@param

@return

     */

public static

new

int

int

char

//遍历输入字符串。  

for (int

//1、获取当前字符。  

            key = json.charAt(i);

//2、如果当前字符是前方括号、前花括号做如下处理:  

if ((key == '[') || (key == '{')) {

//(1)如果前面还有字符,并且字符为“:”,打印:换行和缩进字符字符串。  

if ((i - 1 > 0) && (json.charAt(i - 1) == ':')) {

'\n');

indent(number));

                }

//(2)打印:当前字符。  

                result.append(key);

//(3)前方括号、前花括号,的后面必须换行。打印:换行。  

'\n');

//(4)每出现一次前方括号、前花括号;缩进次数增加一次。打印:新行缩进。  

                number++;

indent(number));

//(5)进行下一次循环。  

continue;

            }

//3、如果当前字符是后方括号、后花括号做如下处理:  

if ((key == ']') || (key == '}')) {

//(1)后方括号、后花括号,的前面必须换行。打印:换行。  

'\n');

//(2)每出现一次后方括号、后花括号;缩进次数减少一次。打印:缩进。  

                number--;

indent(number));

//(3)打印:当前字符。  

                result.append(key);

//(4)如果当前字符后面还有字符,并且字符不为“,”,打印:换行。  

if (((i + 1) < length) && (json.charAt(i + 1) != ',')) {

'\n');

                }

//(5)继续下一次循环。  

continue;

            }

//4、如果当前字符是逗号。逗号后面换行,并缩进,不改变缩进次数。  

           //这里有bug,更改为【并且当前字符后方是双引号或左大括号】************************************************************************************

if ((key == ',') && (json.charAt(i + 1) == '"' || (json.charAt(i + 1) == '{'))) {

                result.append(key);

'\n');

indent(number));

continue;

            }

//5、打印:当前字符。  

            result.append(key);

        }

return

    }


/** 

     * 返回指定次数的缩进字符串。每一次缩进三个空格,即SPACE。 

@param

@return

     */

private static String indent(int

new

for (int

SPACE);

        }

return

    }

}








其他参考代码

package  com.bqt.http.utils;


import java.util.ArrayList;


public class FormatJSONStr {


/**

     * 得到格式化json数据  退格用\t 换行用\r

     */

public static

int

new

for (int

char

if (level > 0 && '\n'

getLevelStr(level));

            }

switch

case '{':

case '[':

"\n");

                level++;

break;

case ',':

"\n");

break;

case '}':

case ']':

"\n");

                level--;

getLevelStr(level));

                jsonForMatStr.append(c);

break;

default:

                jsonForMatStr.append(c);

break;

            }

        }

return

    }


private static String getLevelStr(int

new

for (int

"\t");

        }

return

    }


//**************************************************************************************************************************

/**

    * json字符串的格式化

@param

@param

@return

    */

public static

if (json == null

return null;

        }


int

new

        {

            String jsonTemp = json;

//预读取 

while

getToken(jsonTemp);

                jsonTemp = jsonTemp.substring(token.length());

                token = token.trim();

                tokenList.add(token);

            }

        }


for (int

            String token = tokenList.get(i);

int length = token.getBytes().length;

if (length > fixedLenth && i < tokenList.size() - 1 && tokenList.get(i + 1).equals(":")) {

                fixedLenth = length;

            }

        }


new

int

for (int


            String token = tokenList.get(i);


if (token.equals(",")) {

                buf.append(token);

doFill(buf, count, fillStringUnit);

continue;

            }

if (token.equals(":")) {

" ").append(token).append(" ");

continue;

            }

if (token.equals("{")) {

                String nextToken = tokenList.get(i + 1);

if (nextToken.equals("}")) {

                    i++;

"{ }");

else

                    count++;

                    buf.append(token);

doFill(buf, count, fillStringUnit);

                }

continue;

            }

if (token.equals("}")) {

                count--;

doFill(buf, count, fillStringUnit);

                buf.append(token);

continue;

            }

if (token.equals("[")) {

                String nextToken = tokenList.get(i + 1);

if (nextToken.equals("]")) {

                    i++;

"[ ]");

else

                    count++;

                    buf.append(token);

doFill(buf, count, fillStringUnit);

                }

continue;

            }

if (token.equals("]")) {

                count--;

doFill(buf, count, fillStringUnit);

                buf.append(token);

continue;

            }


            buf.append(token);

//左对齐 

if (i < tokenList.size() - 1 && tokenList.get(i + 1).equals(":")) {

int fillLength = fixedLenth - token.getBytes().length;

if

for (int

" ");

                    }

                }

            }

        }

return

    }


private static

new

boolean isInYinHao = false;

while

            String token = json.substring(0, 1);

            json = json.substring(1);


if

":") || token.equals("{") || token.equals("}") || token.equals("[") || token.equals("]") || token.equals(","))) {

if

                    buf.append(token);

                }


break;

            }


if (token.equals("\\")) {

                buf.append(token);

                buf.append(json.substring(0, 1));

                json = json.substring(1);

continue;

            }

if (token.equals("\"")) {

                buf.append(token);

if

break;

else

true;

continue;

                }

            }

            buf.append(token);

        }

return

    }


private static void doFill(StringBuilder buf, int

"\n");

for (int

            buf.append(fillStringUnit);

        }

    }

}