前端针对JSON格式的一些数据格式化处理

1、前端需求说明

因为前端有时会展示一些json的代码格式,或者处理json变为javascript对象,因此在这里整理一些方法对json数据格式进行处理。

2、JSON转对象

1.代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>json_format</title>
</head>

<body>
  <script>
    var json_data = eval(
      {
        "caller": "web",
        "callee": "lb_controller",
        "event_id": "27",
        "error_code": 200,
        "error_msg": "",
        "response_data": [{
          "vs_status": "enable",
          "vs_name": "vs_nrs-nginx-core_https443_CMRH-PRD-CORE",
          "partition": "RH-Base",
          "dc_chn": "sk",
          "lb_chn": "f5",
          "proto": "https",
          "type": "standard",
          "ip": "111.222.123.122",
          "port": "443",
          "http_profile": "http_XFF",
          "ssl_cert": "cc.com.cert",
          "redirect_https": "0",
          "name": "nrs-nginx-core_https443_CMRH-PRD-CORE",
          "status": "enable",
          "member": [
            { "ip": "111.222.123.123", "port": "80", "status": "enable" },
            { "ip": "111.111.124.124", "port": "80", "status": "enable" }
          ],
          "lb_method": "round",
          "persistence": "cookie",
          "heatlh_check": "/Common/tcp",
          "irule": { "name": "/Common/irule_redirectHTTPS", "content": "" }
        }]
      })
    function objTostring(o) {
      var r = [];
      if (typeof o == "string") {
        return "\"" + o.replace(/([\'\"\\])/g, "\\$1").replace(/(\n)/g, "\\n").replace(/(\r)/g, "\\r").replace(/(\t)/g, "\\t") + "\"";
      }
      if (typeof o == "object") {
        if (!o.sort) {
          for (var i in o) {
            r.push(i + ":" + obj2string(o[i]));
          }
          if (!!document.all && !/^\n?function\s*toString\(\)\s*\{\n?\s*\[native code\]\n?\s*\}\n?\s*$/.test(o.toString)) {
            r.push("toString:" + o.toString.toString());
          }
          r = "{" + r.join() + "}";
        } else {
          for (var i = 0; i < o.length; i++) {
            r.push(obj2string(o[i]))
          }
          r = "[" + r.join() + "]";
        }
        return r;
      }
      return o.toString();
    }
    
    document.write(objTostring(json_data))
  </script>
</body>

</html>
2.效果

在这里插入图片描述

3、JSON数据格式化

1.代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    var json_data = '{"caller":"web","callee":"lb_controller","event_id":"27","error_code":200,"error_msg":"","response_data":[{"vs_status":"enable","vs_name":"vs_nrs-nginx-core_https443_CMRH-PRD-CORE","partition":"RH-Base","dc_chn":"sk","lb_chn":"f5","proto":"https","type":"standard","ip":"111.222.123.122","port":"443","http_profile":"http_XFF","ssl_cert":"cc.com.cert","redirect_https":"0","name":"nrs-nginx-core_https443_CMRH-PRD-CORE","status":"enable","member":[{"ip":"111.222.123.123","port":"80","status":"enable"},{"ip":"111.111.124.124","port":"80","status":"enable"}],"lb_method":"round","persistence":"cookie","heatlh_check":"/Common/tcp","irule":{"name":"/Common/irule_redirectHTTPS","content":""}}]}'

    function transitionJsonToString(jsonObj, callback) {
      // 转换后的jsonObj受体对象
      var _jsonObj = null;
      // 判断传入的jsonObj对象是不是字符串,如果是字符串需要先转换为对象,再转换为字符串,这样做是为了保证转换后的字符串为双引号
      if (Object.prototype.toString.call(jsonObj) !== '[object String]') {
        try {
          _jsonObj = JSON.stringify(jsonObj);
        } catch (error) {
          // 转换失败错误信息
          console.error('您传递的json数据格式有误,请核对...');
          console.error(error);
          callback(error);
        }
      } else {
        try {
          jsonObj = jsonObj.replace(/(\')/g, '"');
          _jsonObj = JSON.stringify(JSON.parse(jsonObj));
        } catch (error) {
          // 转换失败错误信息
          console.error('您传递的json数据格式有误,请核对...');
          console.error(error);
          callback(error);
        }
      }
      return _jsonObj;
    }

    function formatJson(jsonObj, callback) {
      // 正则表达式匹配规则变量
      var reg = null;
      // 转换后的字符串变量
      var formatted = '';
      // 换行缩进位数
      var pad = 0;
      // 一个tab对应空格位数
      var PADDING = '&nbsp;&nbsp;&nbsp;&nbsp;';
      // json对象转换为字符串变量
      var jsonString = transitionJsonToString(jsonObj, callback);
      if (!jsonString) {
        return jsonString;
      }
      // 存储需要特殊处理的字符串段
      var _index = [];
      // 存储需要特殊处理的“再数组中的开始位置变量索引
      var _indexStart = null;
      // 存储需要特殊处理的“再数组中的结束位置变量索引
      var _indexEnd = null;
      // 将jsonString字符串内容通过\r\n符分割成数组
      var jsonArray = [];
      // 正则匹配到{,}符号则在两边添加回车换行
      jsonString = jsonString.replace(/([\{\}])/g, '\r\n$1\r\n');
      // 正则匹配到[,]符号则在两边添加回车换行
      jsonString = jsonString.replace(/([\[\]])/g, '\r\n$1\r\n');
      // 正则匹配到,符号则在两边添加回车换行
      jsonString = jsonString.replace(/(\,)/g, '$1\r\n');
      // 正则匹配到要超过一行的换行需要改为一行
      jsonString = jsonString.replace(/(\r\n\r\n)/g, '\r\n');
      // 正则匹配到单独处于一行的,符号时需要去掉换行,将,置于同行
      jsonString = jsonString.replace(/\r\n\,/g, ',');
      // 特殊处理双引号中的内容
      jsonArray = jsonString.split('\r\n');
      jsonArray.forEach(function (node, index) {
        // 获取当前字符串段中"的数量
        var num = node.match(/\"/g) ? node.match(/\"/g).length : 0;
        // 判断num是否为奇数来确定是否需要特殊处理
        if (num % 2 && !_indexStart) {
          _indexStart = index;
        }
        if (num % 2 && _indexStart && _indexStart != index) {
          _indexEnd = index;
        }
        // 将需要特殊处理的字符串段的其实位置和结束位置信息存入,并对应重置开始时和结束变量
        if (_indexStart && _indexEnd) {
          _index.push({
            start: _indexStart,
            end: _indexEnd,
          });
          _indexStart = null;
          _indexEnd = null;
        }
      });
      // 开始处理双引号中的内容,将多余的"去除
      _index.reverse().forEach(function (item, index) {
        var newArray = jsonArray.slice(item.start, item.end + 1);
        jsonArray.splice(
          item.start,
          item.end + 1 - item.start,
          newArray.join('')
        );
      });
      // 奖处理后的数组通过\r\n连接符重组为字符串
      jsonString = jsonArray.join('\r\n');
      // 将匹配到:后为回车换行加大括号替换为冒号加大括号
      jsonString = jsonString.replace(/\:\r\n\{/g, ':{');
      // 将匹配到:后为回车换行加中括号替换为冒号加中括号
      jsonString = jsonString.replace(/\:\r\n\[/g, ':[');
      // 将上述转换后的字符串再次以\r\n分割成数组
      jsonArray = jsonString.split('\r\n');
      // 将转换完成的字符串根据PADDING值来组合成最终的形态
      jsonArray.forEach(function (item, index) {
        // console.log(item);
        var i = 0;
        // 表示缩进的位数,以tab作为计数单位
        var indent = 0;
        // 表示缩进的位数,以空格作为计数单位
        var padding = '';
        if (item.match(/\{$/) || item.match(/\[$/)) {
          // 匹配到以{和[结尾的时候indent加1
          indent += 1;
        } else if (
          item.match(/\}$/) ||
          item.match(/\]$/) ||
          item.match(/\},$/) ||
          item.match(/\],$/)
        ) {
          // 匹配到以}和]结尾的时候indent减1
          if (pad !== 0) {
            pad -= 1;
          }
        } else {
          indent = 0;
        }
        for (i = 0; i < pad; i++) {
          padding += PADDING;
        }
        formatted += padding + item + '<br />';
        pad += indent;
      });
      // 返回的数据需要去除两边的空格
      return formatted.trim();
    }
    document.write(formatJson(json_data))
  </script>
</body>

</html>
2.效果

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SmallTeddy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值