開發谷歌瀏覽器插件會上癮,搞了一個JSONViewer,一個頁面格式化多條JSON,提升工作效率

来源:https://www.cnblogs.com/oppoic/archive/2019/02/27/10444012.html
-Advertisement-
Play Games

最近寫了一個谷歌瀏覽器插件(Chrome extension),拿出來分享下,希望能提升大家的工作效率。 一、背景 先說痛點:日常開發中,經常需要不停的把介面輸出的JSON拷貝到線上JSON格式化頁面進行校驗、查看和對比等操作,但是現在主流的線上JSON格式化網站都只支持單個操作,如果想同時查看多條 ...


最近寫了一個谷歌瀏覽器插件(Chrome extension),拿出來分享下,希望能提升大家的工作效率。

一、背景

先說痛點:日常開發中,經常需要不停的把介面輸出的JSON拷貝到線上JSON格式化頁面進行校驗、查看和對比等操作,但是現在主流的線上JSON格式化網站都只支持單個操作,如果想同時查看多條JSON,那麼就得開多個瀏覽器標簽頁,效率非常底下。比如這樣

想看另一條JSON必須切換標簽頁,重覆的操作一兩次還可以,久而久之就無法忍受了。如果能把這些JSON都在一個頁面上格式化就好了。

二、嘗試解決

一個頁面格式化多條JSON,那就是從本來的一個操作區域變成多個操作區域。首先想到的是拷貝下別人的代碼,初始化對象的時候多初始化幾個,這樣就一個變多個了。於是找到國內某搜索排名靠前的JSON格式化網站來研究。看看他們的js

看了後非常疑惑,js為什麼要寫成這樣?這個_0x6eb0對象里的元素為什麼都轉成了16進位的,剛開始還想著挨個轉回來看看到底是什麼,突然想到Chrome已經拿到了這個對象,列印一下就可以了

到這裡才明白了,就是不讓你舒服的看源碼。不過這個js還好,想拿來用的話恢復和修改的難度不大,看看另一個js

1萬多行混淆的代碼,變數名都替換成了短的,想看某個變數怎麼定義的、方法在哪裡調用過,搜索都沒辦法搜索,基本放棄了。

三、撥雲見日

既然國內的JSON格式化網站沒法抄了,就到國外找找,Google上搜索JSON Formatter,前幾個網站界面都不一樣,但是用的都是JSONEditor這個編輯器。JSONEditor的簡介是:"A web-based tool to view, edit, format, and validate JSON",看來能滿足需求了,看下這個編輯器的效果圖

看下對應的代碼

<!DOCTYPE html>
<html lang="en">

<head>
    <title>test page</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <link rel="stylesheet" type="text/css" href="dist/jsoneditor.min.css">
    <script type="text/javascript" src="dist/jsoneditor.min.js"></script>
    <style type="text/css">
        #container {
            width: 500px;
            height: 600px;
        }
    </style>
</head>

<body>
    <div id="container"></div>

    <script type="text/javascript">
        var container = document.getElementById('container');
        var options = {
            mode: 'code',
            onError: function (err) {
                alert(err.toString());
            }
        };
        var editor = new JSONEditor(container, options);
    </script>
</body>

</html>

非常簡潔,這個editor還自帶json格式化、壓縮和去除轉義的功能,無需自己實現。為了方便佈局,用下Bootstrap的柵欄模式,看看多個editor在一起的效果

對應的代碼是

<!DOCTYPE html>
<html lang="en">

<head>
    <title>test page</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <link rel="stylesheet" type="text/css" href="dist/jsoneditor.min.css">
    <link rel="stylesheet" type="text/css" href="dist/bootstrap.min.css">
    <script type="text/javascript" src="dist/jquery.min.js"></script>
    <script type="text/javascript" src="dist/jsoneditor.min.js"></script>
    <script type="text/javascript" src="dist/bootstrap.min.js"></script>
</head>

<body>
    <div class="container-fluid">
        <div class="row">
            <div class="col-xs-12 col-sm-6 col-md-6 col-lg-6">
                <div id="container1"></div>
            </div>
            <div class="col-xs-12 col-sm-6 col-md-6 col-lg-6">
                <div id="container2"></div>
            </div>
        </div>
    </div>

    <script type="text/javascript">
        var container1 = document.getElementById('container1');
        var container2 = document.getElementById('container2');
        var options = {
            mode: 'code',
            onError: function (err) {
                alert(err.toString());
            }
        };

        var editor1 = new JSONEditor(container1, options);
        var editor2 = new JSONEditor(container2, options);

        var wHeight = $(window).height();
        $("#container1,#container2").height(wHeight);
    </script>
</body>

</html>
View Code

到這裡又該疑惑了:一個頁面到底放幾個editor合適。最終決定根據瀏覽器視窗寬度動態控制個數

function getMaxBoxCount() {
    var screenWidth = $(window).width();

    var maxBoxCount = 0;
    if (screenWidth < 1024) {
        maxBoxCount = 1;
    }
    else if (screenWidth >= 1024 && screenWidth < 1920) {//1080p
        maxBoxCount = 2;
    }
    else if (screenWidth >= 1920 && screenWidth < 2560) {//2k
        maxBoxCount = 3;
    }
    else if (screenWidth >= 2560 && screenWidth < 3840) {//4k
        maxBoxCount = 4;
    }
    else if (screenWidth >= 3840 && screenWidth < 5120) {//5k
        maxBoxCount = 5;
    }
    else if (screenWidth >= 5120) {//5k+
        maxBoxCount = 6;
    }
    return maxBoxCount;
}

如果用戶的顯示器是5k的,那麼放6個editor,一個頁面同時顯示6段JSON,基本夠用了。如果不夠再開一個標簽頁,就是12個了。
當然也不強制必須開幾個,允許關掉editor為剩下的editor獲取更大的顯示寬度。這裡需要註意的就是:單頁應用不停的關閉和增加editor對象必須要考慮銷毀,否則越來越卡。JSONEditor提供了JSONEditor.destroy()方法,文檔里是這樣描述destroy方法的:"Destroy the editor. Clean up DOM, event listeners, and web workers."。

調用destroy方法之前必須得有editor對象,所以初始化的時候就給存起來

var jsonEditorArr = [];
var cnr = $("[data-tgt='container']");
$.each(cnr, function (i, v) {
    editor = new JSONEditor(v, jsonEditorOptions);
    jsonEditorArr.push(editor);
});

之後每次刪除和增加editor都必須維護這個jsonEditorArr數組

var idx = $(this).parents(".mainBox").next().index();
jsonEditorArr.splice(idx, 0, editor);//增加

jsonEditorArr[idx].destroy();
jsonEditorArr.splice(idx, 1);//移除

至此功能就差不多了,繼續為這個插件加一些常用功能

1.複製

複製editor里的JSON到剪切板,再去別的地方粘貼出來結構不亂。使用的是clipboard-polyfill這個庫,不需要初始化和銷毀對象等操作,直接調用api無腦copy即可,省事省心。示例代碼

clipboard.writeText(jsonCopy).then(function () {
    console.log('ok');
}, function (err) {
    console.log(err);
});

2.粘貼

別的地方複製的JSON,到這裡不需要右鍵然後粘貼了,直接點粘貼按鈕即可,每次操作省一次滑鼠右擊。同樣藉助了clipboard-polyfill這個庫。示例代碼

clipboard.readText().then(function (result) {
    console.log('剪切板里的內容是:'+result);
}, function (err) {
    console.log(err);
});

3.下載

保存JSON到本地,省的複製全部,然後到本地新建txt粘貼保存了。使用了FileSaver.js,示例代碼

var blob = new Blob([jsonData], { type: "text/plain;charset=utf-8" });
saveAs(blob, "jsonviewer.txt");

至此,功能就都完成了,來看看最終的效果圖

四、感謝

Bootstrap

ace

jsoneditor

clipboard-polyfill

FileSaver.js

toastr

用到瞭如上庫,感謝無私分享

五、下載與安裝

GitHub:https://github.com/oppoic/JSONViewer/

Chrome web store:https://chrome.google.com/webstore/detail/jsonviewer/khbdpaabobknhhlpglenglkkhdmkfnca

crx文件:https://github.com/oppoic/JSONViewer/raw/master/crx/JSONViewer.crx

註:

1)crx文件安裝方式:打開Chrome瀏覽器 - 更多工具 - 擴展程式,把crx文件拖進來

2)GitHub源碼安裝方式:下載源碼,打開Chrome瀏覽器 - 更多工具 - 擴展程式,打開“開發者模式” - 載入已解壓的擴展程式 - 選擇源碼的src目錄 - 確定

六、總結

本插件完全是前端實現,可以雙擊html頁面運行,也可以發佈到伺服器上。做成谷歌瀏覽器插件完全是為了方便:每次需要格式化JSON就點谷歌瀏覽器右上角的插件圖標即可。

想要運行HTML頁面的到源碼包里找這個文件:JSONViewer\test\jsonviewer-test2.html

本文地址:https://www.cnblogs.com/oppoic/p/10444012.html,如果覺得不錯,請不吝點個贊併到Github上Star本項目,謝謝!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大家都知道,評論和評分是決定app在appstore中排名的重要因素,但是大部分用戶下載安裝APP後卻不會去點評,所以添加提示用戶去點評的功能是很必要的。 目前,AppStore點贊評分有兩種方法,一種是跳出應用,跳轉到AppStore;進行評分.另一種是在應用內,內置AppStore進行評分. 序 ...
  • 【目錄】 (一)上傳圖片到伺服器一 Android代碼 (二)上傳圖片到伺服器二 Android 系統7.0以上調用相機相容問題 (三)上傳圖片到伺服器三 後臺伺服器代碼 一、相關知識 ①Android許可權申請 ②網路訪問框架OKHttp ③記憶體溢出問題:圖片壓縮 ④Android 系統7.0以上調 ...
  • 1). 在block內部使用外部指針且會造成迴圈引用情況下,需要用__week修飾外部指針: __weak typeof(self) weakSelf = self; 2). 在block內部如果調用了延時函數還使用弱指針會取不到該指針,因為已經被銷毀了,需要在block內部再將弱指針重新強引用一下 ...
  • 最近由於項目需要, 一直在研究藍牙4.0,在這兒分享給大家, 望共同進步. 一、關於藍牙開發的一些重要的理論概念: 1.當前ios中開發藍牙所運用的系統庫是<CoreBluetooth/CoreBluetooth.h>。 2.藍牙外設必須為4.0及以上(2.0需要MFI認證),否則無法開發,藍牙4. ...
  • 一、前言 LLDB是個開源的內置於XCode的具有REPL(read-eval-print-loop)特征的Debugger,其可以安裝C++或者Python插件。在日常的開發和調試過程中給開發人員帶來了非常多的幫助。瞭解並熟練掌握LLDB的使用是非常有必要的。這篇文章將會帶著大家一起瞭解在iOS開 ...
  • Unity 4.7 導出工程在XCode9/10上報錯 validateRenderPassDescriptor:644: failed assertion `Texture at colorAttachment[0] has usage (0x01) which doesn't specify M... ...
  • BBWebImage 設計思路 BBWebImage 是 Swift 圖片組件,用於圖片下載、緩存、編解碼、編輯與展示。 GitHub 地址: "https://github.com/Silence GitHub/BBWebImage" 效果圖 下載、展示並緩存原圖 下載、漸進式解碼、編輯圖片,緩存 ...
  • 前置條件是所有用戶相關介面都走 https,非用戶相關列表類數據走 http。 步驟 第一次登陸 getUserInfo 裡帶有一個長效 token,該長效 token 用來判斷用戶是否登陸和換取短 token 把長效 token 保存到 SharedPreferences 介面請求用長效 toke ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...