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);}}}
JSON 格式化为易读格式的字符串的更多相关文章
- markdown简易快速的编辑格式(易读易写)
实现简单快速书写,格式指定简便.易读易写 讲解http://wowubuntu.com/markdown/ 简单使用的讲解:http://www.ituring.com.cn/article/23 代 ...
- C# 中将月份格式化为英语缩写格式
在测试Android 系统的时候,日期输入框需要输入英语短格式,如下. 考虑到系统日期格式和地域的关系紧密,地域不同,日期格式不同,所以经过查找,找到下面的解决方法. date.ToString(&q ...
- toJSON() 方法,将 Date 对象转换为字符串,并格式化为 JSON 数据格式。
JavaScript toJSON() 方法 定义和用法 toJSON() 方法可以将 Date 对象转换为字符串,并格式化为 JSON 数据格式. JSON 数据用同样的格式就像x ISO-8601 ...
- JSON字符串格式化为JSON对象
根据项目需要,需要对json格式的字符串格式化为json对象,以下是解决方法: 参考文章:https://www.cnblogs.com/cailijuan/p/10150918.html
- 把json格式对象转成可提交字符串格式,会过滤掉函数 {a: {b: 3}, b: [1], c: "d"} -> a.b=3&b[0]=1&c=d
var json = { name: "任务名称" , scoreRule: "", score: "", // 如果规则表达式不为空,则默 ...
- Javascript将字符串日期格式化为yyyy-mm-dd的方法 js number 类型 没有length 属性 string类型才有
日期格式化相信对于大家来说再熟悉不过,最近工作中自己利用Javascript就写了一个,现在将实现的代码分享给大家,希望对有需要的朋友们能有所帮助,感兴趣的朋友们下面来一起看看吧. 这篇文章主要介绍的 ...
- C#中将long浮点数格式化为{H:min:s.ms}格式的字符串的方法
场景 表示时间的数据格式为浮点数,如下: 需要将其格式化为{H:min:s.ms}格式的字符串,效果如下: 注: 博客主页:https://blog.csdn.net/badao_liumang_qi ...
- .net core将URL请求格式化为XML或JSON(网站动态生成sitemap.xml)
.net core将URL请求格式化为XML或JSON(网站动态生成sitemap.xml) 首先设置 Startup.cs 文件 配置 ConfigureServices services .Add ...
- 使用 dynamic 标记解析JSON字符串 JDynamic :支持Json反序列化为Dynamic对象
使用 dynamic 标记解析JSON字符串 http://www.cnblogs.com/taotaodetuer/p/4171327.html 1 string jsonStr = " ...
随机推荐
- uvalive 5721 Activation (概率dp+方程)
题目链接:http://vjudge.net/problem/viewProblem.action?id=24999 主要思想就是解方程的思想. 二维dp应该很容易想到,就是当前位置加队伍长度. dp ...
- AngularJs的Select演示
昨天需要在项目使用Angular.js的select,测试了好久才研究出怎么进行赋值,操作. HTML代码 <!DOCTYPE html> <html> <head> ...
- jQuery截取字符串插件区分中英文
jQuery截取字符串插件区分中英文:截取字符串功能在大量网站都有应用,比如新闻列表这样的功能,因为新闻的标题长途未必都是恰如其分的,所以要根据需要截取指定长度的字符串,下面就分享一个jQuery实现 ...
- html5--canvas学习笔记
1. 添加<canvas>元素 right: <canvas id="myCanvas" width="300" height="3 ...
- Android 多线程:使用Thread和Handler
当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分 ...
- python ATM购物程序
需求: 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还,按欠 ...
- Django models通过DateTimeField保存到MySQL的时间的时区问题
最近开始使用Django开发一些系统,在models.py中设置一些数据库表结构并给日期时间字段赋初值,不过在使用的过程中,遇到一点问题.问题是,我本来服务器使用的市区是“Asia/Shanghai” ...
- Light OJ 1104 第六周F题
F - 概率(经典问题) Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Descri ...
- 关于-webkit-tap-highlight-color的一些事儿
这个属性只用于iOS (iPhone和iPad).当你点击一个链接或者通过Javascript定义的可点击元素的时候,它就会出现一个半透明的灰色背景.要重设这个表现,你可以设置-webkit-tap- ...
- SAE、搜狐云景和百度云之初见
近期有需求将我们的应用部署到公有云的服务平台上,于是找了几家公有云服务做了一下调研, 首先对比一下他们提供的功能: 功能 SAE 搜狐云景 百度云 版本控制工具 svn GIT,和百度云的比起来,用 ...