文档章节

java格式化json

脑丨残
 脑丨残
发布于 2015/06/12 09:02
字数 764
阅读 20
收藏 0
public class FormatJson {
	/**
	 * prefix of ascii string of native character
	 */
	private static String PREFIX = "\\u";


	public static String showJson(String json){
		json = ascii2Native(json);
		json = formatJson(json, "<br>");
		return json;
	}
	public static String native2Ascii(String str) {
		char[] chars = str.toCharArray();
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < chars.length; i++) {
			sb.append(char2Ascii(chars[i]));
		}
		return sb.toString();
	}

	/**
	 * Native character to ascii string.
	 * 
	 * @param c
	 *            native character
	 * @return ascii string
	 */
	private static String char2Ascii(char c) {
		if (c > 255) {
			StringBuilder sb = new StringBuilder();
			sb.append(PREFIX);
			int code = (c >> 8);
			String tmp = Integer.toHexString(code);
			if (tmp.length() == 1) {
				sb.append("0");
			}
			sb.append(tmp);
			code = (c & 0xFF);
			tmp = Integer.toHexString(code);
			if (tmp.length() == 1) {
				sb.append("0");
			}
			sb.append(tmp);
			return sb.toString();
		} else {
			return Character.toString(c);
		}
	}

	/**
	 * unicode编码转化为汉字(asci编码转化为16进制编码)
	 * 
	 * @param str
	 * @return
	 */
	public static String ascii2Native(String unicodeStr) {
		StringBuilder sb = new StringBuilder();
		int begin = 0;
		int index = unicodeStr.indexOf(PREFIX);
		while (index != -1) {
			sb.append(unicodeStr.substring(begin, index));
			sb.append(ascii2Char(unicodeStr.substring(index, index + 6)));
			begin = index + 6;
			index = unicodeStr.indexOf(PREFIX, begin);
		}
		sb.append(unicodeStr.substring(begin));
		return sb.toString();
	}

	/**
	 * 将asci编码转化为16进制编码
	 * 
	 * @param unicodeStr
	 * @return
	 */
	private static char ascii2Char(String unicodeStr) {
		if (unicodeStr.length() != 6) {
			throw new IllegalArgumentException(
					"Ascii string of a native character must be 6 character.");
		}
		if (!"\\u".equals(unicodeStr.substring(0, 2))) {
			throw new IllegalArgumentException(
					"Ascii string of a native character must start with \"\\u\".");
		}
		String tmp = unicodeStr.substring(2, 4);
		int code = Integer.parseInt(tmp, 16) << 8;
		tmp = unicodeStr.substring(4, 6);
		code += Integer.parseInt(tmp, 16);
		return (char) code;
	}

	/**
	 * json字符串的格式化
	 * 
	 * @param jsonString
	 *            Json字符数据
	 * @param fillStringUnit
	 *            每一层之前的占位符号比如空格 制表符
	 * @return
	 */
	public static String formatJson(String jsonString, String fillStringUnit) {
		// 数据为null,则返回空数据
		if (jsonString == null || jsonString.trim().length() == 0) {
			return null;
		}

		// 预读取(分行)
		ArrayList<String> eachRowStringList = new ArrayList<String>();
		{
			String jsonTemp = jsonString;
			// 预读取
			while (jsonTemp.length() > 0) {
				// 获取每一行的串
				String eachRowString = getEachRowOfJsonString(jsonTemp);
				// 将此行字符串存入List当中
				eachRowStringList.add(eachRowString.trim());

				// 除去此行字符及其之前字符串后,剩余的字符串(去执行下一次循环)
				jsonTemp = jsonTemp.substring(eachRowString.length());

			}
		}

		int fixedLenth = 0;
		for (int i = 0; i < eachRowStringList.size(); i++) {
			String token = eachRowStringList.get(i);
			int length = token.getBytes().length;
			if (length > fixedLenth && i < eachRowStringList.size() - 1
					&& eachRowStringList.get(i + 1).equals(":")) {
				fixedLenth = length;
			}
		}

		StringBuilder buf = new StringBuilder();
		int count = 0;
		for (int i = 0; i < eachRowStringList.size(); i++) {

			String token = eachRowStringList.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 = eachRowStringList.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 = eachRowStringList.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 < eachRowStringList.size() - 1
					&& eachRowStringList.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();
	}

	/**
	 * 获取每一行的串, { } [ ]等结尾的串
	 * 
	 * @param jsonString
	 * @return
	 */
	private static String getEachRowOfJsonString(String jsonString) {
		StringBuilder buf = new StringBuilder();
		boolean isInYinHao = false;
		while (jsonString.length() > 0) {
			// 获取json串的第一个字符
			String firstString = jsonString.substring(0, 1);
			// 如果第一个字符串是标点符号: { } [ ] ,
			if (!isInYinHao
					&& (firstString.equals(":") || firstString.equals("{")
							|| firstString.equals("}")
							|| firstString.equals("[")
							|| firstString.equals("]") || firstString
							.equals(","))) {
				// 并且此行没有数据,加入到此行当中
				if (buf.toString().trim().length() == 0) {
					buf.append(firstString);
				}
				break;
			}
			// 除第一个字符之外的其他字符
			jsonString = jsonString.substring(1);
			// 如果是汉字字符
			if (firstString.equals("\\")) {
				buf.append(firstString);
				buf.append(jsonString.substring(0, 1));
				jsonString = jsonString.substring(1);
				continue;
			}
			// 如果是引号
			if (firstString.equals("\"")) {
				buf.append(firstString);
				if (isInYinHao) {
					break;
				} else {
					isInYinHao = true;
					continue;
				}
			}
			buf.append(firstString);
		}
		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);
		}
	}
}

上次是js版本的,这次来一发后台版本的,详情见上几篇js格式json数据

入口

showJson(json);

formateJson(json,fillStringUnit);  其实也可以



© 著作权归作者所有

共有 人打赏支持
脑丨残
粉丝 8
博文 60
码字总数 23267
作品 0
西安
私信 提问
那些提升开发人员工作效率的在线工具

点击上方“程序员小灰”,选择“置顶公众号” 有趣有内涵的文章第一时间送达! 本文转载自公众号 Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,...

bjweimengshu
2018/04/18
0
0
RestTemplate提交表单数据的三种方法

用exchange方法提交 exchange既可以执行POST方法,还可以执行GET,所以应用最为广泛,使用方法如下: 用postForEntity进行提交 postForEntity是对exchange的简化,仅仅只需要减少HttpMethod....

1713716445
2018/04/03
0
2
IDEA下面使用Google Java 编码规范

安装插件 google-java-formathttps://plugins.jetbrains.com/plugin/8527-google-java-format 启用插件 格式化代码 参考 google-java-formatGoogle Java Style Guidegoogle-java-format......

亚林瓜子
2018/08/11
0
0
play2.0文档-面向java开发者(5)

Body parsers Body解析器 What is a body parser? body解析器是啥? An HTTP request (at least for those using the POST and PUT operations) contains a body. This body can be formatt......

老盖
2012/04/10
0
0
超好用的Redis管理及监控工具treeNMS

Redis做为现在web应用开发的黄金搭担组合,大量的被应用,广泛用于存储session信息,权限信息,交易作业等热数据。做为一名有10年以上JAVA开发经验的程序员,工作中项目也是广泛使用了Redis,...

李朝强
01/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

独家解密:阿里超大规模数据中心性能分析

郭健美,阿里巴巴高级技术专家,目前主要从事数据中心的性能分析和软硬件结合的性能优化。CCF 系统软件专委和软件工程专委的委员。曾主持国家自然科学基金面上项目、入选上海市浦江人才计划A...

阿里云云栖社区
31分钟前
3
0
独家解密:阿里大规模数据中心性能分析

郭健美,阿里巴巴高级技术专家,目前主要从事数据中心的性能分析和软硬件结合的性能优化。CCF 系统软件专委和软件工程专委的委员。曾主持国家自然科学基金面上项目、入选上海市浦江人才计划A...

zhaowei121
34分钟前
1
0
mongodb系列~配置文件的优化与处理

mongodb系列~配置文件的优化与处理 一 简介:讲讲如何优化mongo配置文件 二 常规参数 port= //端口 fork=true//守护进程方式启动mongo logpath=shard.log //mongo日志存放路径 journal= tru...

linjin200
36分钟前
1
0
同一台 windows10 设备,安装两个不同版本的mysql

两个mysql 的my.ini文件需要 配置不同的端口。 [mysqld]# 设置3307端口port=3307# 设置mysql的安装目录basedir=F:\\mysql-5.7.24-winx64 # 切记此处一定要用双斜杠\\,单斜杠我这里...

无敌小学僧
36分钟前
2
0
条码插件TBarCode Office系列教程一(Word Add-In篇)

TBarCode Office是一款适用于Microsoft Word 2007、2010和2013的条码插件,通过此插件可以轻松的在您的文档中嵌入代码。此系列教程旨在介绍TBarCode Office的常见问题及解答,帮助大家学习使...

ymy_666666
37分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部