当前位置: 首页 > news >正文

Json对象格式化字符串输出[转]

在研究yahoo音乐API,发现他的数据传出你可以任选xml和json,这是相当酷的事,于是写了个小例子来调用。因为读回来的歌曲数目通常会很多,于是想把json数据直接显示在页面上,想了想,貌似没有直接的方法,结果网上发现有一个比较好的实现,全文转载,原文地址

函数的主要功能是:传入一个Json对象(为了节省空间,一般请求返回的Json都是没有格式化的,可读性不好),可以输出格式化字符串,提高Json可读性。
虽然很多IDE或工具已经实现,但有时做简单测试时,格式化还是需要的。
假设,JS调用(假设界面有一个id为result的textarea)

var json = {
    Id: 1,
    Name: "Test",
    Date: new Date(),
    Subjects:
    [
        {
            Name: "语文"
        },
        {
            Name: "数学"
        },
        {
            Name: "英语",
            Marks: [90, 100, 83, { Test: "aaa"}]
        }
    ],
    Company:
    {
        Name: "Microsoft",
        Location: "USA"
    },
    Test: null
};
//-------------测试
//格式化Json字符串
document.getElementById("result").value = JsonUti.convertToString(json);

界面输出
s1.jpg
实现代码如下:

var JsonUti = {
//定义换行符
            n: "\n",
//定义制表符
            t: "\t",
//转换String
            convertToString: function(obj) {
return JsonUti.__writeObj(obj, 1);
            },
//写对象
            __writeObj: function(obj    //对象
                    , level             //层次(基数为1)
                    , isInArray) {       //此对象是否在一个集合内
//如果为空,直接输出null
if (obj == null) {
return "null";
                }
//为普通类型,直接输出值
if (obj.constructor == Number || obj.constructor == Date || obj.constructor == String || obj.constructor == Boolean) {
var v = obj.toString();
var tab = isInArray ? JsonUti.__repeatStr(JsonUti.t, level - 1) : "";
if (obj.constructor == String || obj.constructor == Date) {
//时间格式化只是单纯输出字符串,而不是Date对象
return tab + ("\"" + v + "\"");
                    }
else if (obj.constructor == Boolean) {
return tab + v.toLowerCase();
                    }
else {
return tab + (v);
                    }
                }
//写Json对象,缓存字符串
var currentObjStrings = [];
//遍历属性
for (var name in obj) {
var temp = [];
//格式化Tab
var paddingTab = JsonUti.__repeatStr(JsonUti.t, level);
                    temp.push(paddingTab);
//写出属性名
                    temp.push(name + " : ");
var val = obj[name];
if (val == null) {
                        temp.push("null");
                    }
else {
var c = val.constructor;
if (c == Array) { //如果为集合,循环内部对象
                            temp.push(JsonUti.n + paddingTab + "[" + JsonUti.n);
var levelUp = level + 2;    //层级+2
var tempArrValue = [];      //集合元素相关字符串缓存片段
for (var i = 0; i < val.length; i++) {
//递归写对象                         
                                tempArrValue.push(JsonUti.__writeObj(val[i], levelUp, true));
                            }
                            temp.push(tempArrValue.join("," + JsonUti.n));
                            temp.push(JsonUti.n + paddingTab + "]");
                        }
else if (c == Function) {
                            temp.push("[Function]");
                        }
else {
//递归写对象
                            temp.push(JsonUti.__writeObj(val, level + 1));
                        }
                    }
//加入当前对象“属性”字符串
                    currentObjStrings.push(temp.join(""));
                }
return (level > 1 && !isInArray ? JsonUti.n : "")                       //如果Json对象是内部,就要换行格式化
+ JsonUti.__repeatStr(JsonUti.t, level - 1) + "{" + JsonUti.n     //加层次Tab格式化
+ currentObjStrings.join("," + JsonUti.n)                       //串联所有属性值
+ JsonUti.n + JsonUti.__repeatStr(JsonUti.t, level - 1) + "}";   //封闭对象
            },
            __isArray: function(obj) {
if (obj) {
return obj.constructor == Array;
                }
return false;
            },
            __repeatStr: function(str, times) {
var newStr = [];
if (times > 0) {
for (var i = 0; i < times; i++) {
                        newStr.push(str);
                    }
                }
return newStr.join("");
            }
        };

转载于:https://www.cnblogs.com/walkerwang/archive/2011/03/01/1968049.html

相关文章:

  • 为何企业热衷于审核机制?
  • excel 字符串连接和求差集
  • 《基于MFC的OpenGL编程》Part 8 Colors
  • C#基础系列问题三委托知识总结2
  • 软件开发求助 源码+网页
  • 在MS系统中用netsh命令改IP地址。
  • 工作vs.事业
  • 常用缓存软件
  • 命令行安装安全证书
  • 100题_26 和为n连续正数序列
  • 实战Active Directory站点部署与管理,Active Directory系列之十
  • Office 2007免序列号安装的ISO制作方法
  • 继神曲之后的忐忑(解决多款浏览器兼容xml问题)
  • 工业故事:奇瑞的故事(转载)
  • php Socket 入门例子
  • JavaScript-如何实现克隆(clone)函数
  • docker容器内的网络抓包
  • JavaScript学习总结——原型
  • Mysql优化
  • Phpstorm怎样批量删除空行?
  • 百度地图API标注+时间轴组件
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 给Prometheus造假数据的方法
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 十年未变!安全,谁之责?(下)
  • 树莓派 - 使用须知
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 鱼骨图 - 如何绘制?
  • - 转 Ext2.0 form使用实例
  • 容器镜像
  • 我们雇佣了一只大猴子...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​马来语翻译中文去哪比较好?
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (13)Hive调优——动态分区导致的小文件问题
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (solr系列:一)使用tomcat部署solr服务
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (十六)串口UART
  • (四)鸿鹄云架构一服务注册中心
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • ../depcomp: line 571: exec: g++: not found
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET 的程序集加载上下文
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 回调、接口回调、 委托
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调