文档章节

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
西安
机动车登记证样本 北京 天津 上海 河北省 深圳 广东省 河北省 机动车

xml转json的两种方法 1.第一种方法 使用JSON-JAVA提供的方法,之前一直使用json-lib提供的方法转json,后来发现了这个开源项目,觉得用起来很不错,并且可以修改XML.java中的parse方法满足自...

java小吊
08/22
0
0
RestTemplate提交表单数据的三种方法

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

1713716445
04/03
0
2
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
那些提升开发人员工作效率的在线工具

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

bjweimengshu
04/18
0
0
IDEA下面使用Google Java 编码规范

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

亚林瓜子
08/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Maven 项目中依赖的搜索顺序

ettings_mirror 的优先级高于 central settings_profile_repo 优先级高于 settings_mirror settings_profile_repo 优先级高于 pom_repositories settings_profile_repo 优先级高于 pom_prof......

xingyu4j
13分钟前
1
0
改变maven项目的名称

pom.xml <groupId>com.soft.xxx</groupId><artifactId>xxx</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>xxx Maven Webapp</name><build>......

1713716445
15分钟前
2
0
windows下按照RabbitMQ

rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rabbit MQ 是建立在Erlang OTP平...

zhaochaochao
15分钟前
2
0
10个PHP比特币开源项目

如果你是一个Phper,如果你希望学习区块链,那么本文列出的10个开源的Php比特币项目,将有助于你了解在自己的应用中如何加入对比特币的支持。 如果你希望快速掌握使用Php对接比特币钱包的方法...

笔阁
22分钟前
14
0
MyBatis级联探讨

数据模型 <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper name......

职业搬砖20年
26分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部