用JAVA给JSON进行排版

之前听到朋友的面试题,是如何对JSON进行排版,于是就写了一个Demo,觉得挺有意思的,就贴出来了。

这个就是记录缩进来输出,大家也可以尝试一下其他更好算法来进行输出。

功能:可以把一行的JSON字符串格式化后进行输出,带有缩进,看起来更加直观。

        支持JSON格式的字符串和文件格式化输出。

代码:

package json;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import vote.Vote;

/**
 * JSON打印器
 * @author jiujie
 * @version $Id: JSONPrinter.java, v 0.1 2016年7月28日 下午5:08:41 jiujie Exp $
 */
public class JSONPrinter {

    private Object jsonObj;

    /** 
     * JSON文件打印器
     * constructor
     * @author jiujie
     * 2016年7月28日 下午5:08:59
     * @param jsonFile
     */
    public JSONPrinter(File jsonFile) {
        this.jsonObj = jsonFile;
    }

    /** 
     * JSON字符串打印器
     * constructor
     * @author jiujie
     * 2016年7月28日 下午5:08:59
     * @param jsonString
     */
    public JSONPrinter(String jsonString) {
        this.jsonObj = jsonString;
    }

    public void print() {
        if (jsonObj instanceof File) {
            try {
                print(new FileInputStream((File) jsonObj));
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if (jsonObj instanceof String) {
            try {
                print(new ByteArrayInputStream(((String) jsonObj).getBytes()));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private void print(InputStream inputStream) throws IOException {

        InputStreamReader in = new InputStreamReader(inputStream);
        int read = 0;
        int indent = 0;
        while ((read = in.read()) > 0) {
            char ch = (char) read;
            switch (ch) {
                case '{': {
                    indent = printAndRightMove(indent, ch);
                    break;
                }
                case '}': {
                    indent = printAndLeftMove(indent, ch);
                    break;
                }
                case '[': {
                    indent = printAndRightMove(indent, ch);
                    break;
                }
                case ']': {
                    indent = printAndLeftMove(indent, ch);
                    break;
                }
                case ',': {
                    System.out.println(ch);
                    System.out.print(getBlankString(indent));
                    break;
                }
                default: {
                    System.out.print(ch);
                    break;
                }
            }
        }
        in.close();
    }

    private int printAndLeftMove(int indent, char ch) {
        System.out.println();
        indent -= 2;
        System.out.print(getBlankString(indent) + ch);
        return indent;
    }

    private int printAndRightMove(int indent, char ch) {
        System.out.println();
        System.out.println(getBlankString(indent) + ch);
        indent += 2;
        System.out.print(getBlankString(indent));
        return indent;
    }

    private String getBlankString(int length) {
        if (length <= 0) {
            return "";
        }
        String blankString = "";
        for (int i = 0; i < length; i++) {
            blankString += " ";
        }
        return blankString;
    }

    public static void main(String[] args) throws FileNotFoundException, IOException {
        ClassLoader classLoader = Vote.class.getClassLoader();
        String path = classLoader.getResource("").toString().replace("/bin", "").replace("file:/",
            "") + "src/json/json.txt";
        JSONPrinter jsonPrinter = new JSONPrinter(new File(path));
        jsonPrinter.print();

        JSONPrinter stringJsonPrinter = new JSONPrinter("{score:100,age:30}");
        stringJsonPrinter.print();
    }

}

 输出

{ 
    {
      "name":"perfumeType",
      "values":
      [
        "EDT",
        "EDP"
      ],
      "countMap":
      {
        "EDT":68,
        "EDP":27
      }
    }
  ]
}
{
  score:100,
  age:30
}

 

posted @ 2016-07-28 17:52  uwannerme  阅读(1488)  评论(0编辑  收藏  举报