html代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/json_format.js" ></script>
<script type="text/javascript" src="js/jsonFormater.js" ></script>
<style>
.jf-PropertyName{
color: #CC0000;
}
.jf-String{
color: #007777;
}
#josn_div{
font-family: Lucida Console,Georgia;
color: #000000;
border: solid 1px #CECECE;
width: 90%;
background-color: #FFFFDD;
}
</style>
<script type="text/javascript"> var jf = null; //创建对象
$(function(){
var options = {
dom : '#test_light', //对应容器的css选择器
baseDom : "json_text"
};
jf = new JsonFormater(options); //创建对象
}); function testJson(){
jf.baseFomat($("#json_input").val());
} function testHighLight(){
jf.doFormat($("#json_input").val()); //格式化json
} </script>
</head>
<body>
<input type="text" id="json_input" placeholder="请输入json"/>
<input type="button" value="数据转换" onclick="testJson()"/>
<input type="button" value="高亮" onclick="testHighLight()"/>
<br>
<textarea id="json_text" cols="50" rows="20" style="background-color: #263238; font-weight:bold ; color: #A5E88D; font-family: "Source Sans Pro", 'Microsoft Yahei', '微软雅黑', sans-serif, Helvetica, 'Hiragino Sans GB', Arial;">
</textarea> <div id="josn_div">
<pre id="test_light"> </pre>
</div>
</body>
</html>

  JS脚本:

function JsonFormater(opt) {
this.options = $.extend({
dom: '',//带有高亮、关键字颜色设置
baseDom:'', //基本格式节点
tabSize: 2,
singleTab: " ",
quoteKeys: true,
imgCollapsed: "img/Collapsed.gif",
imgExpanded: "img/Expanded.gif",
isCollapsible: true
}, opt || {});
this.isFormated = false;
this.obj = {
_dateObj: new Date(),
_regexpObj: new RegExp()
};
this.init();
}
JsonFormater.prototype = {
init: function () {
this.tab = this.multiplyString(this.options.tabSize, this.options.singleTab);
this.bindEvent();
},
// 基本格式转换-只读模式
baseFomat: function(txt,compress/*是否为压缩模式*/){/* 格式化JSON源码(对象转换为JSON文本) */
var indentChar = ' ';
if(/^\s*$/.test(txt)){
alert('数据为空,无法格式化! ');
return;
}
try{var data=eval('('+txt+')');}
catch(e){
alert('数据源语法错误,格式化失败! 错误信息: '+e.description,'err');
return;
};
var draw=[],last=false,This=this,line=compress?'':'\n',nodeCount=0,maxDepth=0; var notify=function(name,value,isLast,indent/*缩进*/,formObj){
nodeCount++;/*节点计数*/
for (var i=0,tab='';i<indent;i++ )tab+=indentChar;/* 缩进HTML */
tab=compress?'':tab;/*压缩模式忽略缩进*/
maxDepth=++indent;/*缩进递增并记录*/
if(value&&value.constructor==Array){/*处理数组*/
draw.push(tab+(formObj?('"'+name+'":'):'')+'['+line);/*缩进'[' 然后换行*/
for (var i=0;i<value.length;i++)
notify(i,value[i],i==value.length-1,indent,false);
draw.push(tab+']'+(isLast?line:(','+line)));/*缩进']'换行,若非尾元素则添加逗号*/
}else if(value&&typeof value=='object'){/*处理对象*/
draw.push(tab+(formObj?('"'+name+'":'):'')+'{'+line);/*缩进'{' 然后换行*/
var len=0,i=0;
for(var key in value)len++;
for(var key in value)notify(key,value[key],++i==len,indent,true);
draw.push(tab+'}'+(isLast?line:(','+line)));/*缩进'}'换行,若非尾元素则添加逗号*/
}else{
if(typeof value=='string')value='"'+value+'"';
draw.push(tab+(formObj?('"'+name+'":'):'')+value+(isLast?'':',')+line);
};
};
var isLast=true,indent=0;
notify('',data,isLast,indent,false);
if(this.options.baseDom){
$("#"+this.options.baseDom).html(draw.join(''));
}else{
return draw.join('');
}
}, // 带有颜色、高亮功能额格式化方法
doFormat: function (json) {
var html;
var obj;
try {
if(typeof json == 'object'){
obj = [json];
}else{
if (json == ""){
json = "\"\"";
}
obj = eval("[" + json + "]");
}
html = this.ProcessObject(obj[0], 0, false, false, false);
$(this.options.dom).html("<pre class='jf-CodeContainer'>" + html + "</pre>");
this.isFormated = true;
} catch (e) {
alert("JSON数据格式不正确:\n" + e.message);
$(this.options.dom).html("");
this.isFormated = false;
}
},
bindEvent: function () {
var that = this;
$(this.options.dom).off('click','.imgToggle');
$(this.options.dom).on('click', '.imgToggle', function () {
if (that.isFormated == false) {
return;
}
that.makeContentVisible($(this).parent().next(), !$(this).data('status'));
});
},
expandAll: function () {
if (this.isFormated == false) {
return;
}
var that = this;
this.traverseChildren($(this.options.dom), function(element){
if(element.hasClass('jf-collapsible')){
that.makeContentVisible(element, true);
}
}, 0);
},
collapseAll: function () {
if (this.isFormated == false) {
return;
}
var that = this;
this.traverseChildren($(this.options.dom), function(element){
if(element.hasClass('jf-collapsible')){
that.makeContentVisible(element, false);
}
}, 0);
},
collapseLevel: function(level){
if (this.isFormated == false) {
return;
}
var that = this;
this.traverseChildren($(this.options.dom), function(element, depth){
if(element.hasClass('jf-collapsible')){
if(depth >= level){
that.makeContentVisible(element, false);
}else{
that.makeContentVisible(element, true);
}
}
}, 0); },
isArray: function (obj) {
return obj &&
typeof obj === 'object' &&
typeof obj.length === 'number' && !(obj.propertyIsEnumerable('length'));
},
getRow: function (indent, data, isPropertyContent) {
var tabs = "";
if (!isPropertyContent) {
tabs = this.multiplyString(indent, this.tab);
}
if (data != null && data.length > 0 && data.charAt(data.length - 1) != "\n") {
data = data + "\n";
}
return tabs + data;
},
formatLiteral: function (literal, quote, comma, indent, isArray, style) {
if (typeof literal == 'string') {
literal = literal.split("<").join("<").split(">").join(">");
}
var str = "<span class='jf-" + style + "'>" + quote + literal + quote + comma + "</span>";
if (isArray) str = this.getRow(indent, str);
return str;
},
formatFunction: function (indent, obj) {
var tabs;
var i;
var funcStrArray = obj.toString().split("\n");
var str = "";
tabs = this.multiplyString(indent, this.tab);
for (i = 0; i < funcStrArray.length; i++) {
str += ((i == 0) ? "" : tabs) + funcStrArray[i] + "\n";
}
return str;
},
multiplyString: function (num, str) {
var result = '';
for (var i = 0; i < num; i++) {
result += str;
}
return result;
},
traverseChildren: function (element, func, depth) {
var length = element.children().length;
for (var i = 0; i < length; i++) {
this.traverseChildren(element.children().eq(i), func, depth + 1);
}
func(element, depth);
},
makeContentVisible : function(element, visible){
var img = element.prev().find('img');
if(visible){
element.show();
img.attr('src', this.options.imgExpanded);
img.data('status', 1);
}else{
element.hide();
img.attr('src', this.options.imgCollapsed);
img.data('status', 0);
}
},
ProcessObject: function (obj, indent, addComma, isArray, isPropertyContent) {
var html = "";
var comma = (addComma) ? "<span class='jf-Comma'>,</span> " : "";
var type = typeof obj;
var clpsHtml = "";
var prop;
if (this.isArray(obj)) {
if (obj.length == 0) {
html += this.getRow(indent, "<span class='jf-ArrayBrace'>[ ]</span>" + comma, isPropertyContent);
} else {
clpsHtml = this.options.isCollapsible ? "<span><img class='imgToggle' data-status='1' src='" + this.options.imgExpanded + "'/></span><span class='jf-collapsible'>" : "";
html += this.getRow(indent, "<span class='jf-ArrayBrace'>[</span>" + clpsHtml, isPropertyContent);
for (var i = 0; i < obj.length; i++) {
html += this.ProcessObject(obj[i], indent + 1, i < (obj.length - 1), true, false);
}
clpsHtml = this.options.isCollapsible ? "</span>" : "";
html += this.getRow(indent, clpsHtml + "<span class='jf-ArrayBrace'>]</span>" + comma);
}
} else if (type == 'object') {
if (obj == null) {
html += this.formatLiteral("null", "", comma, indent, isArray, "Null");
} else {
var numProps = 0;
for (prop in obj) numProps++;
if (numProps == 0) {
html += this.getRow(indent, "<span class='jf-ObjectBrace'>{ }</span>" + comma, isPropertyContent);
} else {
clpsHtml = this.options.isCollapsible ? "<span><img class='imgToggle' data-status='1' src='" + this.options.imgExpanded + "'/></span><span class='jf-collapsible'>" : "";
html += this.getRow(indent, "<span class='jf-ObjectBrace'>{</span>" + clpsHtml, isPropertyContent);
var j = 0;
for (prop in obj) {
var quote = this.options.quoteKeys ? "\"" : "";
html += this.getRow(indent + 1, "<span class='jf-PropertyName'>" + quote + prop + quote + "</span>: " + this.ProcessObject(obj[prop], indent + 1, ++j < numProps, false, true));
}
clpsHtml = this.options.isCollapsible ? "</span>" : "";
html += this.getRow(indent, clpsHtml + "<span class='jf-ObjectBrace'>}</span>" + comma);
}
}
} else if (type == 'number') {
html += this.formatLiteral(obj, "", comma, indent, isArray, "Number");
} else if (type == 'boolean') {
html += this.formatLiteral(obj, "", comma, indent, isArray, "Boolean");
}else if (type == 'undefined') {
html += this.formatLiteral("undefined", "", comma, indent, isArray, "Null");
} else {
html += this.formatLiteral(obj.toString().split("\\").join("\\\\").split('"').join('\\"'), "\"", comma, indent, isArray, "String");
}
return html;
}
};

  

jsonFormater之应用的更多相关文章

  1. 【转】json格式化、高亮库jsonFormater

    http://leo108.com/pid-1996.asp JsonFormater 基于jQuery的json格式化.高亮库 核心代码参考天马行空工作室,本人只做了模块化和一些代码优化. demo ...

  2. Xcode插件优缺点对比(推荐20款插件)

    本文大致整理了自己用过的一些插件的使用感想(就是好不好用). 在那之前先简单贴两条插件须知,知道的可以忽略. 1.Alcatraz 类似于管理第三方库的cocoapods,管理插件也有个Alcatra ...

  3. javascript的一点学习

    最近用vue.js用的很爽,在全栈开发的路上一路狂奔,发现后台跟前台一起确实更有意义. 记录一个比较有意思的bug: 目标是对一个全局的paramList进行json格式化显示.代码借鉴了 http: ...

  4. 【转】Xcode 插件优缺点对比(推荐 20 款插件)

    [转自]http://www.cnblogs.com/dsxniubility/p/5099191.html 1.Alcatraz 类似于管理第三方库的cocoapods,管理插件也有个Alcatra ...

  5. xcode 必用插件二

    本文大致整理了自己用过的一些插件的使用感想(就是好不好用). 在那之前先简单贴两条插件须知,知道的可以忽略. 1.Alcatraz 类似于管理第三方库的cocoapods,管理插件也有个Alcatra ...

  6. 简易的highcharts公共绘图模块封装--基于.net mvc

    运行效果: 之所以选择这个图表插件,是因为它较其他同类插件轻量且中文文档详细完整,Demo丰富,配置使用简单.具体内容请登录中文官网:http://www.hcharts.cn/ 项目详细: 项目环境 ...

  7. Xcode 插件优缺点对比(推荐 20 款插件)

    链接地址:http://mp.weixin.qq.com/s?__biz=MjM5OTM0MzIwMQ==&mid=402439598&idx=1&sn=e8800cb0aa2 ...

  8. 插上腾飞的翅膀:为asp.net core添加protobuf支持

    没时间解释了,快上车. 通过NuGet获取Zaabee.AspNetCoreProtobuf Install-Package Zaabee.AspNetCoreProtobuf 在Startup.cs ...

  9. 基于async/non-blocking高性能redis组件库BeetleX.Redis

    BeetleX.Redis是基于async/non-blocking模式实现的高性能redis组件库,组件支持redis基础指令集,并封装更简便的List,Hashset和Subscribe操作.除了 ...

随机推荐

  1. 【Mac】安装 Homebrew 出错 Failed during: git fetch origin master:refs/remotes/origin/master --tags --force

    今天在 Mac 装 Homebrew 遇到了一个问题,在网上找了大量解决方案,做个总结. Mac 版本 High Sierra 10.13.6. 问题描述 在 Mac 终端输入了 Homebrew 官 ...

  2. STM32 SIM800C SIM868 连接OneNet 以及远程控制流程详解

    Onenet控制继电器教程 本文基于STM32物联网开发版:https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.29e71debNLqzW ...

  3. 20155204第4次实验《Android程序设计》实验报告

    20155204第四次实验报告 一.实验内容及步骤 1.Android Stuidio的安装测试: 安装 Android Stuidio 完成Hello World, 要求修改res目录中的内容,He ...

  4. 20155212 2016-2017-2 《Java程序设计》第2周学习总结

    20155212 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 三种print System.out.println:在标准输出中显示文字后换行. Syst ...

  5. DIV+CSS实现竖排按钮样式

    <div class="btn_left btn_left1">每日单元成功率</div><br/> <div class="b ...

  6. BZOJ054_移动玩具_KEY

    题目传送门 这道题我写IDA*写挂了,TLE+WA,只AC了两个点. 这道题标算BFS+状态压缩. code: /******************************************* ...

  7. 图解Oracle下建立tnsname

    第一步:运行netca: 第二步: 第三步: 第四步: 第五步: 第六步: 如果前面设置都正确,测试的结果将正常(前提是Database的listener要开启).

  8. bzoj1854 [Scoi2010]游戏 ([SCOI2010]连续攻击游戏)

    bzoj1854 [Scoi2010]游戏 ([SCOI2010]连续攻击游戏) 据说正解是并查集???我不会 这不是一道匈♂牙利好题吗??? 一个装备的两个属性都向它连边,然后跑一遍匈♂牙利 注意: ...

  9. 我们一起学习WCF 第三篇头消息验证用户身份

    前言:今天我主要写的是关于头消息的一个用处验证用户信息 下面我画一个图,可以先看图 第一步:我们先开始做用户请求代码 首先:创建一个可执行的上下文对象块并定义内部传输的通道 using (Operat ...

  10. [转]WIN2008 IIS7的日期格式

    最近项目升级服务器从32位升级到64位的WIN2008,日期显示格式非我们所期望的yyyy-M-d格式,原以为修改控制面板的日期格式即可,可是不行. 修改注册表问题解决. 修改方法: 运行注册表编辑器 ...