JSON 格式化为易读格式的字符串

算法

http://blog.csdn.net/yanghaitaohhh/article/details/39672783

使用算法如下:

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

1、获取当前字符。

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

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

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

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

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

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

5、打印:当前字符。

代码

package com.bqt.http.utils;

public class JsonFormatTool {

//单位缩进字符串。

private static String SPACE = "   ";

/**

* 返回格式化JSON字符串。

* @param json 未格式化的JSON字符串。

* @return 格式化的JSON字符串。

*/

public static String formatJson(String json) {

StringBuffer result = new StringBuffer();

int length = json.length();

int number = 0;

char key = 0;

//遍历输入字符串。

for (int i = 0; i < length; i++) {

//1、获取当前字符。

key = json.charAt(i);

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

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

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

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

result.append(‘\n‘);

result.append(indent(number));

}

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

result.append(key);

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

result.append(‘\n‘);

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

number++;

result.append(indent(number));

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

continue;

}

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

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

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

result.append(‘\n‘);

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

number--;

result.append(indent(number));

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

result.append(key);

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

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

result.append(‘\n‘);

}

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

continue;

}

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

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

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

                result.append(key);

result.append(‘\n‘);

result.append(indent(number));

continue;

}

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

result.append(key);

}

return result.toString();

}

/**

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

* @param number 缩进次数。

* @return 指定缩进次数的字符串。

*/

private static String indent(int number) {

StringBuffer result = new StringBuffer();

for (int i = 0; i < number; i++) {

result.append(SPACE);

}

return result.toString();

}

}

其他参考代码

package com.bqt.http.utils;

import java.util.ArrayList;

public class FormatJSONStr {

/**

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

*/

public static String format(String jsonStr) {

int level = 0;

StringBuffer jsonForMatStr = new StringBuffer();

for (int i = 0; i < jsonStr.length(); i++) {

char c = jsonStr.charAt(i);

if (level > 0 && ‘\n‘ == jsonForMatStr.charAt(jsonForMatStr.length() - 1)) {

jsonForMatStr.append(getLevelStr(level));

}

switch (c) {

case ‘{‘:

case ‘[‘:

jsonForMatStr.append(c + "\n");

level++;

break;

case ‘,‘:

jsonForMatStr.append(c + "\n");

break;

case ‘}‘:

case ‘]‘:

jsonForMatStr.append("\n");

level--;

jsonForMatStr.append(getLevelStr(level));

jsonForMatStr.append(c);

break;

default:

jsonForMatStr.append(c);

break;

}

}

return jsonForMatStr.toString();

}

private static String getLevelStr(int level) {

StringBuffer levelStr = new StringBuffer();

for (int levelI = 0; levelI < level; levelI++) {

levelStr.append("\t");

}

return levelStr.toString();

}

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

/**

* json字符串的格式化

* @param json 需要格式的json串

* @param fillStringUnit  每一层之前的占位符号比如空格 制表符

* @return  格式化后的json串

*/

public static String formatJson(String json, String fillStringUnit) {

if (json == null || json.trim().length() == 0) {

return null;

}

int fixedLenth = 0;

ArrayList<String> tokenList = new ArrayList<String>();

{

String jsonTemp = json;

//预读取

while (jsonTemp.length() > 0) {

String token = getToken(jsonTemp);

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

token = token.trim();

tokenList.add(token);

}

}

for (int i = 0; i < tokenList.size(); i++) {

String token = tokenList.get(i);

int length = token.getBytes().length;

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

fixedLenth = length;

}

}

StringBuilder buf = new StringBuilder();

int count = 0;

for (int i = 0; i < tokenList.size(); i++) {

String token = tokenList.get(i);

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

buf.append(token);

doFill(buf, count, fillStringUnit);

continue;

}

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

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

continue;

}

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

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

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

i++;

buf.append("{ }");

} 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++;

buf.append("[ ]");

} 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 (fillLength > 0) {

for (int j = 0; j < fillLength; j++) {

buf.append(" ");

}

}

}

}

return buf.toString();

}

private static String getToken(String json) {

StringBuilder buf = new StringBuilder();

boolean isInYinHao = false;

while (json.length() > 0) {

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

json = json.substring(1);

if (!isInYinHao

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

if (buf.toString().trim().length() == 0) {

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 (isInYinHao) {

break;

} else {

isInYinHao = true;

continue;

}

}

buf.append(token);

}

return buf.toString();

}

private static void doFill(StringBuilder buf, int count, String fillStringUnit) {

buf.append("\n");

for (int i = 0; i < count; i++) {

buf.append(fillStringUnit);

}

}

}

来自为知笔记(Wiz)

时间: 2024-10-29 19:09:59

JSON 格式化为易读格式的字符串的相关文章

Js中Date格式化为字符串

惭愧,混迹博客园2年了,还没写过什么.最近不太忙,就写一下Js中Date对象的字符串转换吧. 直接贴代码,欢迎各位拍砖,吐槽! /*格式化时间 *formatStr 格式,如:YY-MM-DD hh:mm:ss.Y-M-D h:m:s *只有一个M时,月份小于十时前面不追加零,D.h.m.s雷同 */Date.prototype.toStringFormat = function (formatStr) { if (formatStr == null || formatStr == '') re

实例365(8)---------三种方法将字符串格式化为日期

一:DateTime.ParseExact方式,截图 二:代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace ConvertToString { public

把json格式对象转成可提交字符串格式,会过滤掉函数 {a: {b: 3}, b: [1], c: &quot;d&quot;} -&gt; a.b=3&amp;b[0]=1&amp;c=d

var json = { name: "任务名称" , scoreRule: "", score: "", // 如果规则表达式不为空,则默认选中 “按规则表达式计算” unique: 1, startTime: "2014-09-15 20:20:20", endTime: "2014-10-15 20:20:20", status: 1, isTaks: 0, tradeType: 1, descrip

WebService 返回json格式和返回xml格式的数据

返回json格式 //using System.Web.Script.Services; [WebMethod] [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] public void HelloWorld() { Context.Response.Clear(); Context.Response.ContentType = "application/json"; Model.User.U

实例365(1)---------格式化为货币

一:截图 二:代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Format { public partial class Frm_Main : Form

Linux下把U盘格式化为fat32

在linux下也是支持fat32的,如果U盘中了病毒可以插入linux系统进行格式化比较安全,下面介绍如何在linux下把u盘格式化为fat32的方法 一.执行fdisk -l查看linux设备,我的U盘是sdb4 二.执行mkfs -t vfat /dev/sdb4 这样就可以格式化完成了然后在挂载就可以使用了,非常简单.mkfs -t 后面指定格式可以是ext3格式或者其它格式.

orcale将日期格式化为“yyyy年mm月dd日”的形式

orcale将日期格式化为"yyyy年mm月dd日"的形式,懂的人不难,不懂的人就怎么也整不出来. 如下: select to_char(sysdate,'yyyy"年"mm"月"dd"日"') from dual

【转】使用DateFormat把时间长度格式化为&quot;时:分:秒&quot;格式--不错

原文网址:http://ssd910.blog.163.com/blog/static/238767972010112214114201/ 经常在系统中显示时间长度,基本上每次都是显示秒数,客户觉得按时分秒("HH:mm:ss")的格式显示比较明了,一般开发人员都是自己去计算小时是多少?分钟是多少...,其实可以用DateFormat来格式这个显示方式.示例代码如下:示例: 计算某人总的登陆时间登陆时间是10:12:14结束时间是15:20:35示例代码:  Calendar c1 =

工具类:关于解决数据库中的日期格式,经过response.getWriter().write(json)打到前台日期格式混乱的问题的总结

经过response.getWriter().write(json)打到前台日期格式混乱的问题的总结 import java.text.SimpleDateFormat;import net.sf.json.JsonConfig;import net.sf.json.processors.JsonValueProcessor; public class DateJsonValueProcessor implements JsonValueProcessor{ private String for