zoukankan      html  css  js  c++  java
  • 用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
    }
  • 相关阅读:
    Celery详解
    JWT详解
    进程及进程池
    多线程详解
    python常用模块之os模块的用法
    python常用模块之paramiko与ssh
    reflect 反射
    http 静态文件
    模板渲染语言
    http web 开发
  • 原文地址:https://www.cnblogs.com/uwannerme/p/5715724.html
Copyright © 2011-2022 走看看