新手区 [分享] 分享一个 JSON 格式化的工具 (通过 exe4j 打包 jar 成.exe)

卡农Lucas · 2016年12月12日 · 最后由 卡农Lucas 回复于 2016年12月15日 · 1919 次阅读

  • 好久不发帖,发帖冒个泡。
  • 代码仅供参考(当然有更好的实现方法,不喜勿喷,谢谢)。
  • 随手写了一个 JSON 格式化的工具,省着天天搜索引擎找。
  • 原本是想写一个 javap 反编译之后的代码字节码阅读器,所以工程名字没改。(ByteCodeViewer)

编程语言

  • JAVA

GUI

  • 仅仅使用最简单的 JavaFX

编程工具

  • Eclipse JAVA Neon

打包成 exe

  • exe4j
  • 自己百度下载吧,教程非常简单。

Github

主要代码(可以直接去 github 下载)

目录结构

MainEntry 代码

package yu.shang.luo;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.layout.StackPane;
import javafx.scene.Scene;

public class MainEntry extends Application {

    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("JSON Formater");
        TextArea textArea = new TextArea();
        textArea.setPrefSize(600, 600);
        Button button = new Button("Format JSON");
        button.setMinWidth(50);
        button.setOnAction(action -> {
            Viewer v = new Viewer();
            textArea.setText(v.formatJson(textArea.getText()));
        });
        StackPane root = new StackPane();
        root.getChildren().add(textArea);
        root.getChildren().add(button);
        Scene scene = new Scene(root, 500, 500);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

Viewer 代码

package yu.shang.luo;

import org.apache.commons.lang.StringEscapeUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class Viewer {
    public String formatJson(String jsonStr) {
        String json = null;
        try {
            json = new JSONObject(jsonStr).toString();
        } catch(JSONException e) {
            json = e.getMessage() + "\n";
            try {
                json = new JSONArray(jsonStr).toString();
            } catch(JSONException ex) {
                return json + ex.getMessage();
            }
        }
        StringBuilder sb = new StringBuilder();
        int indent = 0;
        for(int i = 0; i < json.length(); i++) {
            switch(json.charAt(i)) {
                case '{':
                case '[':
                    sb.append(json.charAt(i)).append('\n');
                    indent++;
                    sb.append(this.getIndent(indent));
                    break;
                case '}':
                case ']':
                    indent--;
                    sb.append('\n');
                    sb.append(this.getIndent(indent));
                    sb.append(json.charAt(i));
                    break;
                default:
                    switch(json.charAt(i)) {
                        case ',':
                            sb.append(json.charAt(i)).append('\n');
                            sb.append(this.getIndent(indent));
                            break;
                        default:
                            if(json.charAt(i) == '\\') {
                                if((i + 1) < (json.length() - 1)) {
                                    if(json.charAt(i + 1) == 'u') {
                                        char[] ch = new char[6];
                                        ch[0] = '\\';
                                        for(int j = 1; j < 6; j++) {
                                            ch[j] = json.charAt(++i);
                                        }
                                        String src = new String(ch);
                                        sb.append(StringEscapeUtils.unescapeJava(src));
                                        continue;
                                    }
                                }
                            }
                            sb.append(json.charAt(i));
                    }
            }
        }
        return sb.toString();
    }

    private String getIndent(int indent) {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < indent; i++) {
            sb.append("\t");
        }
        return sb.toString();
    }
}

Best Regards,
Lucas Luo

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 7 条回复 时间 点赞

为神马我的帖子没在最新区域出现?
@Lihuazhang

#2 楼 @lucasluo 有回复和点赞才会有

哦,规则改了?
@Lihuazhang

没人对这个感兴趣嘛

json.cn 的效果是一样的么

@wenchao 恩,没这个工具强大好看。主要是练手,总得写点算法。。。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册