使用JavaScript编程分析多级嵌套JSON文档数据

1.前言

如下图所示的报表数据以文档的形式存储在MongoDB数据库中,需要通过浏览器JavaScript编程来解析数据库所返回的JSON数据。
这里写图片描述

Mongo DB 是一种非关系型数据库(NoSql),其数据存储方式灵活。Mongo DB很好的实现了面向对象的思想(OO思想)。在Mongo DB中 每一条记录都是一个Document对象。Mongo DB数据格式为BSON格式,BSON是一种类JSON的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象。
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON 数据的书写格式是:名称/值对。
参考上图报表,有如下所示数据:

jsons = {"name":"安全生产检查","title":"安全生产组织保障","subtable":[{
        "fieldid":"机房安全防火","contentd":[{
                "fieldtype":"电源","fieldcode":"分值"
            },{
                "fieldtype":"计算机","fieldcode":"分值"
            },{
                "fieldtype":"空调","fieldcode":"分值"
            },{
                "fieldtype":"电视","fieldcode":"分值"
            }]
        },{
        "fieldid":"车辆安全","contentd":[{
                "fieldtype":"年限","fieldcode":"分值"
            },{
                "fieldtype":"保险","fieldcode":"分值"
            }]
        },{
        "fieldid":"其他安全","contentd":[{
                "fieldtype":"年限","fieldcode":"分值"
            }]
        }],"field":"等分"
    };  

此数据为上图表中一行数据的的存储。如想在客户端显示上图报表,需要对从MongoDB返回的JSON数据进行处理。

2. 分析JSON数据,获取单元格纵跨的行数

如果使用HTML中Table来展现报表,则需使用< TD >标签的 rowspan 属性,确定单元格可纵跨的行数。
如图中序号为1行数据,”安全生产组织保障“单元格纵跨的行数为4(rowspan =4)。
例如:针对”jsons “数据,取纵跨行数的设计代码如下:

//取嵌套JSON数据的行数
function getJSONRowNum(subobj){
    var n = 0,m = 0;

    //判断运算符是否定义
    if( typeof(subobj.length) != "undefined" ){
        n = subobj.length;
    }
    for(var tmp in subobj){
        if (typeof(subobj[tmp])=="object"){
            var subtmp_json = subobj[tmp];
            m = m + getJSONRowNum( subtmp_json);
        }   
    }
    if (m > 0){
        n = m;
    }

    return n;            
}

3. 分析JSON对象

在获取JSON数据过程中,通常采用遍历的方式,在遍历过程中需要识别子对象的类型。

    for(var tmp_obj in json_obj){
        //判读是否为字符串
        if (typeof(json_obj[tmp_obj])=="string"){
            //按字符串进行处理...
        }

        if (typeof(json_obj[tmp_obj])=="object"){
            tmp_json = json_obj[tmp_obj];
            //如果是对象,此节点是嵌套类型,需要进行进一步的处理...
            n = getJSONRowNum(tmp_json);
            alert(n);
        }
    }

整合验证代码如下所示:

function showAllElem(){
    var jsons = "";  //定义返回JSON数据字符串

    jsons = "{\"name\":\"安全生产检查\",\"title\":\"安全生产组织保障\",";
    jsons = jsons + "\"subtable\":[{\"fieldid\":\"机房安全防火\",\"contentd\":[{\"fieldtype\":\"电源\",\"fieldcode\":\"分值\"}";
    jsons = jsons + ",{\"fieldtype\":\"计算机\",\"fieldcode\":\"分值\"}";
    jsons = jsons + ",{\"fieldtype\":\"空调\",\"fieldcode\":\"分值\"}";
    jsons = jsons + ",{\"fieldtype\":\"电视\",\"fieldcode\":\"分值\"}]}";
    jsons = jsons + ",{\"fieldid\":\"车辆安全\",\"contentd\":[{\"fieldtype\":\"年限\",\"fieldcode\":\"分值\"}";
    jsons = jsons + ",{\"fieldtype\":\"保险\",\"fieldcode\":\"分值\"}]}";
    jsons = jsons + ",{\"fieldid\":\"其他安全\",\"contentd\":[{\"fieldtype\":\"年限\",\"fieldcode\":\"分值\"}]}]";
    jsons = jsons + ",\"field\":\"等分\"}";   

    //将 JavaScript 对象表示法 (JSON) 字符串转换为对象。
    json_obj = JSON.parse(jsons);
    var strtmp = new String("对象:");

    //var myRowdata = new RowData(1,json_obj);
    //myRowdata.init(json_obj);

    for(var tmp_obj in json_obj){

        if (typeof(json_obj[tmp_obj])=="string"){
            strtmp = strtmp + tmp_obj + ",";
        }

        //alert(strtmp);
        //alert(typeof(json_obj[tmp_obj]));
        if (typeof(json_obj[tmp_obj])=="object"){
            tmp_json = json_obj[tmp_obj];

            n = getJSONRowNum(tmp_json);

            alert(n);
        }
    }   
}

写代码过程中,获得一个小知识:
使用JavaScript运算符时,可以先判断他是否有定义,例如:

    //判断运算符是否定义
    if( typeof(subobj.length) != "undefined" ){
        n = subobj.length;
    }

请关注后续展现报表内容。

参考:
《用MongoDB数据库来管理办公系统中文档型的表单和信息——通用流程化应用审批单设计思路(二,续)》

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肖永威

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值