• 用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
    }
  • 相关阅读:
    [NOI2004]郁闷的出纳员
    【数论】[SDOI2010]古代猪文
    【2-SAT】[JSOI2010]满汉全席
    【数位DP】CF55D Beautiful numbers
    c语言编译的四个阶段
    转评:Python集合
    转评:Python字典
    Python iterators and generators:迭代器和生成器
    Python函数-具备特定功能的可以有参数和返回值的可重用的代码块儿
    Python-简版List和Tuple
  • 原文地址:https://www.cnblogs.com/uwannerme/p/5715724.html
Copyright © 2020-2023  润新知