Java Json字符串格式化

来源:互联网 发布:陕西师范远程网络教育 编辑:程序博客网 时间:2024/05/21 12:50
package com.quanyou.jsonFormat;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* 把json字符串格式化
* @author tangyang
*
*/
public class Format {

/**
* 添加Tab字符的标识字符,当遇到如下字符时会计算是否需要换行和增加当前Tab数
*/
private static final char[] ADD_TAB_NUM_CHAR = new char[] { '[', '{' };
/**
* 减少Tab字符的标识字符,当遇到如下字符时会计算是否需要换行和减少当前Tab数
*/
private static final char[] SUBTRACT_TAB_NUM_CHAR = new char[] { ']', '}' };
/**
* 换行字符
*/
private static final char[] BR_CHAR = new char[] { '\r', '\n' };
/**
* Tab字符
*/
private static final char TAB_CHAR = '\t';
/**
* 遇到","一定会换行
*/
private static final char BR_CHAR_FLAGE = ',';

public static void main(String[] args) {
if(args.length<1){
new Exception("parameter cannot be empty");
}
String fileName = args[0];
if(null == fileName || "".equals(fileName)){
new Exception("file path cannot be null");
}

formcatToJson(fileName);
}

/**
* 格式化字符
* @param fileName
*/
private static void formcatToJson(String fileName){
int tabNum = 0;
boolean isTab = false;
StringBuilder content = new StringBuilder();
char[] charArray = readFile(fileName).toCharArray();
for (int i = 0; i < charArray.length; i++) {
char c = charArray[i];
char n = i < charArray.length - 1 ? charArray[i + 1] : 0;

content.append(c);

isTab = isAddNewLine(c, n);
tabNum += getTabNumStep(c, n);

if (isTab) {
isTab = false;
addTabStr(content, tabNum);
}
}
writeFile(fileName, content.toString());
}

/**
* 从文件读取json串
* @param fileName
* @return
*/
private static String readFile(String fileName){
File file = new File(fileName);
if(!file.exists()){
new Exception("file does not exist");
}
StringBuilder result = new StringBuilder();
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
String tempString = null;
while ((tempString = reader.readLine()) != null) {
result.append(tempString);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result.toString();
}

/**
* 把格式化好的字符串回写到文件
* @param fileName
* @param content
*/
private static void writeFile(String fileName, String content) {
try {
FileWriter writer = new FileWriter(fileName, false);
writer.write(content);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 判断是是否要添加新行
* @param c
* @param n
* @return
*/
private static boolean isAddNewLine(char c, char n) {
boolean result = false;

if (c == BR_CHAR_FLAGE) {
// ","
result = true;
} else if (c == ADD_TAB_NUM_CHAR[0] && n != SUBTRACT_TAB_NUM_CHAR[0]) {
// "[?"
result = true;
} else if (c == ADD_TAB_NUM_CHAR[0] && n == SUBTRACT_TAB_NUM_CHAR[0]) {
// "[]"
result = false;
} else if (c == ADD_TAB_NUM_CHAR[1] && n != SUBTRACT_TAB_NUM_CHAR[1]) {
// "{?"
result = true;
} else if (c == ADD_TAB_NUM_CHAR[1] && n == SUBTRACT_TAB_NUM_CHAR[1]) {
// "{}"
result = false;
} else if (n == SUBTRACT_TAB_NUM_CHAR[0] || n == SUBTRACT_TAB_NUM_CHAR[1]) {
// "?}","?]"
result = true;
}

return result;
}

/**
* 计算是否要增减tabNum的值
* @param c
* @param n
* @return
*/
private static int getTabNumStep(char c, char n) {
int step = 0;

if (c == ADD_TAB_NUM_CHAR[0] && n != SUBTRACT_TAB_NUM_CHAR[0]) {
// "[?"
step = 1;
} else if (c == ADD_TAB_NUM_CHAR[0] && n == SUBTRACT_TAB_NUM_CHAR[0]) {
// "[]"
step = 0;
} else if (c == ADD_TAB_NUM_CHAR[1] && n != SUBTRACT_TAB_NUM_CHAR[1]) {
// "{?"
step = 1;
} else if (c == ADD_TAB_NUM_CHAR[1] && n == SUBTRACT_TAB_NUM_CHAR[1]) {
// "{}"
step = 0;
} else if (n == SUBTRACT_TAB_NUM_CHAR[0] || n == SUBTRACT_TAB_NUM_CHAR[1]) {
// "?}","?]"
step = -1;
}
return step;
}

/**
* 根据tabNum添加Tab字符
* @param chars
* @param tabNum
*/
private static void addTabStr(StringBuilder chars, int tabNum) {
chars.append(BR_CHAR[0]);
chars.append(BR_CHAR[1]);
for (int i = 0; i < tabNum; i++) {
chars.append(TAB_CHAR);
}
}
}