本人对于java的语法不是很熟,算是半路突然入坑这种,之前实现过python生成json文件并导出.json文件;

怎料java的语法有些出入,现整理做个笔记;

推荐个Json格式化工具:json格式化工具

首先了解下JSON的基本语法吧:

1.json的四个基本规则
(1)并列的数据之间用逗号’ , ‘分隔
(2)映射用冒号’ : ‘表示
(3)并列数据的集合(数组)用方括号’ [ ] ‘表示
(4)映射的集合(对象)用大括号’ { } ‘ 表示
2.缺点
(1)要求是unicode,否则会出现乱码
(2)语法过于严禁,必须遵循json语法四个原则
3.
(1)数据结构:object、array
(2)基本类型:string、number、true、false、null
(3)key必须是String类型的,value是任何基本类型或数据结构

以下将针对如下内容示例进行json代码实现并如何导出成一个“.json”文件;

{
    "name":"张铁柱",
    "age":25,
    "height":"185.5",
    "school":"清华",
    "major":[{
              "job1":"worker",
              "job2":"doctor"
                  },
             {
              "job3":"teacher",
              "job4":"student"
                  }],
    "houseLocation":{
        "x":30,
        "y":30
    }
}

代码实现如下:

String fullPath = filePath + File.separator + fileName + ".json";
//例如:fullPath="D:/myroot/test.json"

// 生成json格式文件
 try {
      // 保证创建一个新文件
      File file = new File(fullPath);
      if (!file.getParentFile().exists()) 
       { // 如果父目录不存在,创建父目录
         file.getParentFile().mkdirs();
       }
      if (file.exists()) { // 如果已存在,删除旧文件
         file.delete();
       }
      file.createNewFile();

      //以下创建json格式内容
      //创建一个json对象,相当于一个容器
      JSONObject root =new JSONObject();
      root.put("name","张铁柱");
      root.put("age",25)
      //假设身高是double,我们取小数点后一位
      double height=185.5345;
      root.put("height",(double)(Math.round(height*10)/10.0));
      JSONArray array=new JSONArray();
      JSONObject major1=new JSONObject();
      major1.put("job1","worker");
      major1.put("job2","doctor");
      JSONObject major2=new JSONObject();
      major2.put("job3","teacher");
      major2.put("job4","student");
      array.put( major1);
      array.put( major2);
      root.put("major",array);
      //假设位置x,y都是double型的,现在对他们取整
      double x=30.0045;
      double y=30.1123;
      JSONObject houloc=new JSONObject();
      houloc.put("x",Math.round(x));
      houloc.put("y",Math.round(y));
      root.put("houseLocation",houloc)


      // 格式化json字符串
      jsonString = formatJson(root.toString());

      // 将格式化后的字符串写入文件
      Writer write = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
      write.write(jsonString);
      write.flush();
      write.close();
     } catch (Exception e) {
        e.printStackTrace();
     }

其中会调用到formatJson这个函数,以下就是在同个java文件中定义的该函数以及相关函数:

(以下函数的作用其实就是将json格式的数据进行字符串化且格式上做了美观,要不然输出来的json文件就是一行内容,没有换行,也不对其。建议用notepad查看生产的json文件)

    /**
     * 单位缩进字符串。
     */
    private static String SPACE = "   ";

    /**
     * 返回格式化JSON字符串。
     *
     * @param json 未格式化的JSON字符串。
     * @return 格式化的JSON字符串。
     */
    public static String formatJson(String json) {
        StringBuffer result = new StringBuffer();

        int length = json.length();
        int number = 0;
        char key = 0;

        // 遍历输入字符串。
        for (int i = 0; i < length; i++) {
            // 1、获取当前字符。
            key = json.charAt(i);

            // 2、如果当前字符是前方括号、前花括号做如下处理:
            if ((key == '[') || (key == '{')) {
                // (1)如果前面还有字符,并且字符为“:”,打印:换行和缩进字符字符串。
                if ((i - 1 > 0) && (json.charAt(i - 1) == ':')) {
                    result.append('\n');
                    result.append(indent(number));
                }

                // (2)打印:当前字符。
                result.append(key);

                // (3)前方括号、前花括号,的后面必须换行。打印:换行。
                result.append('\n');

                // (4)每出现一次前方括号、前花括号;缩进次数增加一次。打印:新行缩进。
                number++;
                result.append(indent(number));

                // (5)进行下一次循环。
                continue;
            }

            // 3、如果当前字符是后方括号、后花括号做如下处理:
            if ((key == ']') || (key == '}')) {
                // (1)后方括号、后花括号,的前面必须换行。打印:换行。
                result.append('\n');

                // (2)每出现一次后方括号、后花括号;缩进次数减少一次。打印:缩进。
                number--;
                result.append(indent(number));

                // (3)打印:当前字符。
                result.append(key);

                // (4)如果当前字符后面还有字符,并且字符不为“,”,打印:换行。
                if (((i + 1) < length) && (json.charAt(i + 1) != ',')) {
                    result.append('\n');
                }

                // (5)继续下一次循环。
                continue;
            }

            // 4、如果当前字符是逗号。逗号后面换行,并缩进,不改变缩进次数。
            if ((key == ',')) {
                result.append(key);
                result.append('\n');
                result.append(indent(number));
                continue;
            }

            // 5、打印:当前字符。
            result.append(key);
        }

        return result.toString();
    }

    /**
     * 返回指定次数的缩进字符串。每一次缩进三个空格,即SPACE。
     *
     * @param number 缩进次数。
     * @return 指定缩进次数的字符串。
     */
    private static String indent(int number) {
        StringBuffer result = new StringBuffer();
        for (int i = 0; i < number; i++) {
            result.append(SPACE);
        }
        return result.toString();
    }

参考:

https://blog.csdn.net/muziqin12345/article/details/80265218

https://blog.csdn.net/weixin_42749765/article/details/81533635

https://blog.csdn.net/dearKundy/article/details/79815565