// ==UserScript==
// @license MIT
// @name JSON Viewer
// @namespace http://tampermonkey.net/
// @version 0.4.8
// @note v0.4.8 代码优化
// @note v0.4.7 增加对JSONP的判断,代码优化
// @note v0.4.6 增加复制按钮,JSON脑图CSS样式细节优化,JSON脑图增加收起/展开子节点按钮
// @note v0.4.5 在json-viewer-updated原基础上进行了一些修改,主要有CSS样式修改,新增折叠/展开全部功能,新增JSON脑图功能,脑图节点点击显示调用路径
// @description 格式化显示JSON使数据看起来更加漂亮,支持折叠/展开格式化后的数据,支持JSON脑图让调用层级看着更清晰,支持复制JSON脑图节点路径
// @author Feny
// @match *://*/*
// @grant GM_addStyle
// @grant GM_getResourceText
// @grant GM_setClipboard
// @icon data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAeAB4AAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAEAAAAAAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAAgACADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9wvjF8bLX4ZrHZx+XNqlwnmKjH5YUyRvb6kEAd8H058d1b47XV5Ir3eoN++bagaXYrN6KOBn2FfPPx5/aEutX8a+KNWhIubhruZLSNj8u1WMcIOP4QoXOOwNS/wDBM79lDTfjh8YNe+IXj63TxRdeHfKjsE1KMTxtdSbmMmxvlAiVV2IBsUybgAyKR9ZTy6lhsM69Xovm2+iPmKmOqYjEKjT6v5WXU9e8beKrjxZpp/s/xFrfhjWIwWs9X0q42z2kmPlZo2zDcxjqYZ0eNv7obDDf/YL/AG8L745eJNc+G3xCttP0n4qeEWZZ2sVZNP8AENsu0rd2ysS0ZKPG7RMSQsisCcukWd+3x4RtfhpqGk+JNPjS0g1mV7a8iT5UM4XesgHYsofdjglQepJPxwPE1x4V/au8LePtNkeK40ma0lmdDgyorvHMhPo9uxjP+y1bUcHRxmGbS1adn1TXT0/4fcipiqmExCi3pfVdGn19f+GLni/w7ceGf2wPFXga+Vo5rW/vDbI3WWI/v4HA/wBqBg3tk+lfWX7AXia1+F/iDV9B1CRbWHXjFLayyHannpuUxk+rqy4zxlMdWAPQft7fsL33x91nQfiD4DutP0r4oeDXVrT7cWWx1y3UsTZ3LKCyAh5FEigkLLIpHzBk5vwj4JuvE2kLJfeHdY8N6lGAl5pepwBZrOT+JRIuYp0ByBNCzxPg4bIICqYyljMKot62Sa6prr6P/gBDC1MLiHJLS90+jT6ev/Dnmn/BVP8Aaw0nxv4/8P8Aw18KXK69qmk3MlxqEdiRMwuivlpbrtPLopkMnZNy5IIYLyPwa/Z8vvEmv+HtHu4/Ovr+5iS6KDcqAtukwe6om7nuEJxX0XoH7PK/bJG0vRoY5rr/AFslvbLGZf8AfcAf+PGvafgv8CbX4byNqFyI5tWmXYCoytsh6qvqx7t+A4yWiWYUsLhlRpbr72318kVHA1MTiHVqbP7kl0P/2Q==
// @require https://code.jquery.com/jquery-3.4.1.min.js
// @require https://unpkg.com/layer-src@3.5.1/dist/layer.js
// @require https://unpkg.com/jsmind@0.8.5/es6/jsmind.js
// @resource swalStyle https://unpkg.com/jsmind@0.8.5/style/jsmind.css
// @resource layerStyle https://unpkg.com/layer-src@3.5.1/dist/theme/default/layer.css
// @downloadURL none
// ==/UserScript==
/*随机字符串*/
function randomString(e) {
var e = e || 32,
t = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",
a = t.length,
n = "";
for (i = 0; i < e; i++){
n += t.charAt(Math.floor(Math.random() * a));
}
return n
}
/*检查是否是图片链接*/
function isImg(pathImg) {
var regexp = /^(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?\/([\w#!:.?+=&%@!\-\/])*\.(gif|jpg|jpeg|png|GIF|JPG|PNG)([\w#!:.?+=&%@!\-\/])?/;
return regexp.test(pathImg);
}
/** 检验内容是否是json格式的内容*/
function isJSON(str) {
if (typeof str == 'string') {
try {
var obj = JSON.parse(str);
if(typeof obj == 'object' && obj ){
console.log("is json")
return true;
}else{
console.log("is not json")
return false;
}
} catch(e) {
console.log("is not json", e)
return false;
}
}
}
// jquery.json-viewer 插件 开始
// 解决和原网页jquery版本冲突
var jq = jQuery.noConflict(true);
(function(jq){
/**
* 检查 arg 是否为至少包含 1 个元素的数组或至少包含 1 个键的字典
*/
function isCollapsable(arg) {
return arg instanceof Object && Object.keys(arg).length > 0;
}
/**
* 检查字符串是否为URL
*/
function isUrl(string) {
var regexp = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
return regexp.test(string);
}
/**
* 将 JSON 对象转换为 HTML 表示形式
* @return string
*/
function json2html(json) {
var html = '';
if (typeof json === 'string') {
/* Escape tags */
json = json.replace(/&/g, '&').replace(//g, '>');
if (isUrl(json)){
html += `"${json}"`;
}
else{
html += `"${json}"`;
}
}
else if (typeof json === 'number') {
html += `${json}`;
}
else if (typeof json === 'boolean') {
html += `${json}`;
}
else if (json === null) {
html += 'null';
}
else if (json instanceof Array) {
if (json.length > 0) {
html += '[
';
for (var i = 0; i < json.length; ++i) {
html += '
';
/* Add toggle button if item is collapsable */
if (isCollapsable(json[i])) {
html += '';
}
html += json2html(json[i]);
/* Add comma if item is not last */
if (i < json.length - 1) {
html += ',';
}
html += '
';
}
html += ']';
}
else {
html += '[]';
}
}
else if (typeof json === 'object') {
var key_count = Object.keys(json).length;
if (key_count > 0) {
html += '{
';
for (var key in json) {
if (json.hasOwnProperty(key)) {
html += '
';
/* Add toggle button if item is collapsable */
if (isCollapsable(json[key])) {
html += '';
}
html += `"${key}": ${json2html(json[key])}`;
/* Add comma if item is not last */
if (--key_count > 0){
html += ',';
}
html += '
';
}
}
html += '
}';
}
else {
html += '{}';
}
}
return html;
}
jq.fn.jsonViewer = function(json, jsonpFunctionName) {
return this.each(function() {
/* Transform to HTML */
var html = json2html(json);
/** is JSONP */
if(jsonpFunctionName !== undefined && jsonpFunctionName !== null){
html = `