通过java代码实现对json字符串的格式美化(完整版)

news2024/11/8 8:53:24

一、前言

之前转载过一篇文章,也是有关于通过java代码实现对json字符串的格式美化,但是那篇文章的实现还不够完善,比如其对字符串中出现特殊字符时,会出现转换失败。因此博主本人也是闲暇时在那份代码的基础上做了完善和补充。好,废话不多说,上链接上代码。

本文参考于 https://blog.csdn.net/ardo_pass/article/details/78729978 ,并在其基础上做了完善,且往下看。

二、核心代码

package junjie;

import javax.swing.filechooser.FileSystemView;
import java.io.*;

public class JsonFormatTool{
    private String space = "   ";
    private boolean existLeft = false;

    public static void main(String[] args) throws Exception {
//        JsonFormatTool tool = new JsonFormatTool();
//        String path = FileSystemView.getFileSystemView().getHomeDirectory().getAbsolutePath()+"\\json.txt";
//        String text = tool.readFile(path).replaceAll("\r\n","");
//        String json = tool.formatJson(text);
//        tool.writeFile(path,json);

        JsonFormatTool tool = new JsonFormatTool();
        String text ="{\"info\":[{\"code\":\"C\",\"key\":\"028\",\"nearest\":\"NO\",\"value\":\"好冷\"},{\"code\":\"N\",\"key\":\"0771\",\"nearest\":\"NO,\",\"value\":\"好{冷}\"},{\"code\":\"L\",\"key\":\"07[72\",\"nearest\":\"N]O\",\"value\":\"好冷\"},{\"code\":\"G\",\"key\":\"0773\",\"nearest\":\"NO\",\"value\":\"好冷\"}],\"resultCode\":\"0\",\"resultInfo\":\"SUCCESS\"}";
        String json = tool.formatJson(text);
        System.out.println(json);
    }

    //写入文件
    private void writeFile(String filePath,String text) throws Exception {
        File file = new File(filePath);
        if (!file.exists()){
            file.createNewFile();
        }

        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
        writer.write(text);
        writer.close();
    }

    //读取文件
    private String readFile(String filePath) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "UTF-8"));

        String temp;
        String text = "";
        while ((temp = reader.readLine()) != null){
            text = text + temp.trim() + "\r\n";
        }
        reader.close();
        return text;
    }

    //格式化json
    public 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++){
            key = json.charAt(i);

            if (isEffectSpecChr(i,key,json)){
                if((key == '[') || (key == '{') ){
                    result.append(key);
                    result.append('\n');
                    number++;
                    result.append(indent(number));
                    continue;
                }

                if((key == ']') || (key == '}') ){
                    result.append('\n');
                    number--;
                    result.append(indent(number));
                    result.append(key);
                    continue;
                }

                if((key == ',')){
                    result.append(key);
                    result.append('\n');
                    result.append(indent(number));
                    continue;
                }
            }
            result.append(key);
        }
        return result.toString();
    }

    //过滤有效的特殊字符
    private boolean isEffectSpecChr(int index, char key, String json) {
        boolean flag = false;

        if (isDouMark(index,String.valueOf(key),json)){
            if (existLeft){
                existLeft = false;
            }else {
                existLeft = true;
            }
        }else {
            if ((key == '[')
                    || (key == '{')
                    || (key == ']')
                    || (key == '}')
                    || (key == ',')){
                if (!existLeft){
                    flag = true;
                }
            }
        }
        return flag;
    }

    //判断当前双引号是否为特殊字符
    private boolean isDouMark(int index, String key, String json) {
        if (key.equals("\"") && index >= 0){
            if (index == 0){
                return true;
            }

            char c = json.charAt(index - 1);
            if (c != '\\'){
                return true;
            }
        }
        return false;
    }

    //补充tab空格
    private String indent(int number){
        StringBuffer result = new StringBuffer();
        for(int i = 0; i < number; i++){
            result.append(space);
        }
        return result.toString();
    }
}


三、执行结果

{
   "info":[
      {
         "code":"C",
         "key":"028",
         "nearest":"NO",
         "value":"好冷"
      },
      {
         "code":"N",
         "key":"0771",
         "nearest":"NO,",
         "value":"好{冷}"
      },
      {
         "code":"L",
         "key":"07[72",
         "nearest":"N]O",
         "value":"好冷"
      },
      {
         "code":"G",
         "key":"0773",
         "nearest":"NO",
         "value":"好冷"
      }
   ],
   "resultCode":"0",
   "resultInfo":"SUCCESS"
}

四、与Notepad的json格式化工具比较

Notepad工具若是安装了json格式化工具也可以通过快捷键直接美化json的,其使用方法是:鼠标选中要美化的json字符串然后ctrl+shift+alt+m就可以美化json了(前提是你的notepad已经安装了该插件)

下面的演示,通过io流读取文件演示的,直接截图效果给大家看看:

4.1 含有特殊字符的字符串(这点和notepad没啥区别)

对于含有特殊字符的字符串,也能做格式美化,如{ } [ ] ,”
在这里插入图片描述
效果
在这里插入图片描述

4.2 混乱的换行回车处理(notepad没有对这点进行优化)

在这里插入图片描述
在这里插入图片描述

4.3 不完整的json字符串(notepad对这点也没有优化)

大多数情况下,咱们拷贝到的json字符串也是不完整的,也许缺个大括号小括号啥的,但即便这样,我们也想要美化的,下面演示一下:

这两个位置我们干掉了一个大括号和一个中括号
在这里插入图片描述
再看看格式化效果:
在这里插入图片描述

4.4 json缺失双引号?

有人问,能干掉一个双引号吗?当然不能,格式化json的核心点就是通过双引号去辨别的,若双引号都不对,这个json本身就很有问题,还请用眼睛看吧

五、制作出一个电脑程序

上述,咱们的功能已经完善了,但是咱们要想使用自己这个json格式化工具,难道每次都得打开自己的开发工具,再把json字符串拷贝进来,再点击执行?这个太low了。
咱们幸幸苦苦写完的代码,要费这么大劲才能使用它,那太麻烦了,下面我会教大家将自己的java代码打包成一个可以便捷使用的小程序应用,冬天了手有点冷,打字有僵硬,迟点再更新~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/59220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计校园租赁系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Tomcat服务器的简介以及安装

文章目录1.概念1.1 什么是Web服务器&#xff1f;1.2 静态资源和动态资源1.3 常用服务器产品2. Tomcat的安装2.1 下载2.2 解压安装2.3 Tomcat的目录结构2.4 Tomcat服务器的启动和关闭2.5 tomcat启动失败的原因2.5.1 查看报错原因2.5.2 错误原因2.5.2.1 查看JAVA_HOME配置是正确2…

ESP32——WEB服务程序移植(基于示例restful_server)

一、简介 将ESP32——WEB服务程序测试项目移植到一个现有项目中&#xff0c;现有项目包括基于固定IP的WIFI连接、OTA升级、Websocket等功能。 二、移植 2.1 参考restful_server项目下分区表文件partitions_example.csv修改项目分区 因模块采用ESP32-WROVER-E(4MB)&#xff…

磨金石教育摄影技能干货分享|乡愁摄影作品欣赏——传统建筑篇

俗话说“一方水土养一方人”&#xff0c;不同的山川地域与气候环境早就不同的地域文化。我国幅员广阔&#xff0c;南北东西跨度极大&#xff0c;因此气候环境与地理环境差异很大。在民俗文化上面也呈现出多元化风格。 这种多元化的文化风格清晰的体现在各地的建筑形式上。重庆的…

Java【String】【StringBuilder】【StringBuffer】你都会用吗

文章目录前言一、常用的方法1、字符串构造2、字符串比较3、字符串查找4、字符串转化5、字符串替换6、字符串分割7、字符串截取二、字符串的不可变性三、StringBuilder、StringBuffer总结前言 在校招和笔试过程中&#xff0c;字符串是相当频繁被问到的话题&#xff0c;在之前的…

iMazing兼容Win和Mac2023免费版iOS设备管理器

iMazing是一款ios设备管理软件&#xff0c;该软件支持对基于iOS系统的设备进行数据传输与备份&#xff0c;用户可以将包括&#xff1a;照片、音乐、铃声、视频、电子书及通讯录等在内的众多信息在Windows/Mac电脑中传输/备份/管理。 软件备份是指将一部手机上的重要信息和资料&…

Pytorch -> ONNX -> TensorRT 模型转换与部署

系统环境&#xff1a; Ubuntu 18.04Cuda 11.3Cudnn 8.4.1 1 、Pytorch -> ONNX 网上相关流程很多&#xff0c;我就不重复了 可以参考Pytorch分类模型转onnx以及onnx模型推理 或者直接看Pytorch官方怎么干的。 ONNX Github onnxruntime调用onnx模型推理时有一个provider…

HTML5期末大作业:基于HTML+CSS+JavaScript茶文化中国水墨风格绿色茶叶销售(5页) 学生网页设计作业源码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

用coding向你最爱的人说圣诞快乐

&#x1f384;&#x1f384;&#x1f384;圣诞节即将到来&#xff0c;今天让我们用编码的方式向你最爱的人表达圣诞节快乐。 圣诞节的起源 圣诞节源自古罗马人迎接新年的农神节&#xff0c;与基督教本无关系。在基督教盛行罗马帝国后&#xff0c;教廷将这种民俗节日纳入基督教体…

DenseNet的基本思想

之前的文章介绍过残差网络的基本思想&#xff1a;残差网络的思想就是将网络学习的映射从X到Y转为学习从X到Y-X的差&#xff0c;然后把学习到的残差信息加到原来的输出上即可。即便在某些极端情况下&#xff0c;这个残差为0&#xff0c;那么网络就是一个X到Y的恒等映射。其示意图…

Java基础类型和运算符

文章目录变量与常量变量的命名规则常量final 关键字修饰的常量字面常量基本类型整型基本整型变量 int长整型 long短整型 short比特型 byte浮点数 float和double关于3*0.10.3三种特殊的double字符型 char布尔类型 boolean类型转换隐式类型提升强制类型转换运算符算数运算符基本四…

vue中打印插件vue-print-nb(二)-实例之两种方法——安包之设置一个id和绑定一个对象 下载print.js之ref设置锚点

vue中打印插件vue-print-nb(二)-实例之两种方法——安包之设置一个id和绑定一个对象 & 下载print.js之ref设置锚点 第一种方法 方式1、设置一个id ① 给要打印的部分设置一个 id ② 在打印按钮中添加 v-print"#id名" 1、安装vue-print-nb插件 npm install v…

Firefly RK3399 PC pro Android 10下载验证

一.Android 源码以及image 1.Android 10代码链接&#xff1a; 百度网盘 请输入提取码 密码&#xff1a;1234 下载后检查md5值&#xff0c;检查下载是否正确&#xff1a; fb41fcdc48b1cf90ecac4a5bb8fafc7a Firefly-RK3399_Android10.0_git_20211222.7z.001 82d665fb54fb412…

Flutter ー Authentication 认证

Flutter ー Authentication 认证 原文 https://medium.com/simbu/flutter-authentication-adb8df7cf673 前言 如果我相信我知道你是谁那我就能让你查看你的个人 应用 application 资料。 身份验证可能是应用程序必须处理的最大的交叉问题。 将它作为一个特性添加到 DigestableP…

HashMap JDK1.7与1.8的区别

结构 首先HashMap在1.7中是以数组链表的形式存在的, 而HashMap在1.8中则是以数组链表红黑树构成的, 当一个节点的链表长度超过8并且数组长度超过64时会将链表转换为红黑树, 初始化 初始容量大小介绍 说到数组就不得不提HashMap里面的成员变量DEFAULT_INITIAL_CAPACITY也就是…

Mysql进阶学习(八)DDL语言+数据类型和DTL语言

Mysql进阶学习&#xff08;八&#xff09;DDL语言与DTL语言DDL语言1、简介&#xff1a;1.1、库的管理1.1.1、库的创建1.1.2、库的修改1.1.3、库的删除1.2、表的管理1.2.1.表的创建 ★1.2.2.表的修改1.2.3.表的删除1.2.4.表的复制测试案例1. 创建表dept12. 将表departments中的数…

SpringBoot_整合Thymeleaff模板引擎

Thymeleaf模板引擎的主要目标是将优雅的自然模板带到开发工作流程中&#xff0c;并将HTML在浏览器中正确显示&#xff0c;并且可以作为静态原型&#xff0c;让开发团队能更容易地协作。Thymeleaf能够处理HTML&#xff0c;XML&#xff0c;JavaScript&#xff0c;CSS甚至纯文本。…

Qt扫盲-Qt Designer 设计师使用总结

Designer 设计师使用总结一、顶部菜单栏1. 常用的菜单内容2. 快捷工具栏说明二、左侧控件栏1. 组件分类2. 筛选三、中间绘图区1. 左侧控件区拖放控件到中间2. 中间区域布局3. 属性修改四、右侧属性栏1. 对象查看器2. 属性编辑器3.组织结构2. 属性设置五、美化专栏1.单个设置层叠…

微服务框架 SpringCloud微服务架构 12 DockerCompose 12.2 部署微服务集群

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构12 DockerCompose12.2 部署微服务集群12.2.1 直接开干12 DockerCompose 1…

大数据:Hive简介及核心概念

一、简介 Hive 是一个构建在 Hadoop 之上的数据仓库&#xff0c;它可以将结构化的数据文件映射成表&#xff0c;并提供类 SQL 查询功能&#xff0c;用于查询的 SQL 语句会被转化为 MapReduce 作业&#xff0c;然后提交到 Hadoop 上运行。 特点&#xff1a; 简单、容易上手 (…