天天看點

原生js格式化json和格式化xml的方法

在工作中一直看各位前輩的部落格解決各種問題,對我的幫助很大,非常感謝! 之前一直比較忙沒有寫部落格,終于過年有了點空閑時間,可以把自己積累的東西分享下,筆記中的部分函數不是自己寫的,都是工作中一點點積累的,由于時間已久比較零散找不到對應的主人了,沒法注明出處還請見諒。我們經常遇到從後代拿到的沒有格式化的json和xml,需要格式化好了以後顯示在頁面上,這篇文章希望可以讓您更加友善的實作這個需求。本文的代碼使用原生方式編寫,不需要引用其他插件,可以在傳統項目和自動化項目中直接使用。為了友善測試,我整理了下,隻要建一個空的html,将所有的代碼copy進去,本地打開就可以檢視效果。做好的html在GitHub上也放了一份,以後有時間就會将自己整理的筆記放到上面,位址如下:  https://github.com/binginsist/binginsistNote      
格式化json執行個體

      
1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>原生js格式化json的方法</title>
 6 </head>
 7 <body>
 8 <!--格式化後的json寫入的位置-->
 9 <div id="writePlace"></div>
10 <script>
11     //格式化代碼函數,已經用原生方式寫好了不需要改動,直接引用就好
12     var formatJson = function (json, options) {
13         var reg = null,
14                 formatted = \'\',
15                 pad = 0,
16                 PADDING = \'    \';
17         options = options || {};
18         options.newlineAfterColonIfBeforeBraceOrBracket = (options.newlineAfterColonIfBeforeBraceOrBracket === true) ? true : false;
19         options.spaceAfterColon = (options.spaceAfterColon === false) ? false : true;
20         if (typeof json !== \'string\') {
21             json = JSON.stringify(json);
22         } else {
23             json = JSON.parse(json);
24             json = JSON.stringify(json);
25         }
26         reg = /([\{\}])/g;
27         json = json.replace(reg, \'\r\n$1\r\n\');
28         reg = /([\[\]])/g;
29         json = json.replace(reg, \'\r\n$1\r\n\');
30         reg = /(\,)/g;
31         json = json.replace(reg, \'$1\r\n\');
32         reg = /(\r\n\r\n)/g;
33         json = json.replace(reg, \'\r\n\');
34         reg = /\r\n\,/g;
35         json = json.replace(reg, \',\');
36         if (!options.newlineAfterColonIfBeforeBraceOrBracket) {
37             reg = /\:\r\n\{/g;
38             json = json.replace(reg, \':{\');
39             reg = /\:\r\n\[/g;
40             json = json.replace(reg, \':[\');
41         }
42         if (options.spaceAfterColon) {
43             reg = /\:/g;
44             json = json.replace(reg, \':\');
45         }
46         (json.split(\'\r\n\')).forEach(function (node, index) {
47                     var i = 0,
48                             indent = 0,
49                             padding = \'\';
50 
51                     if (node.match(/\{$/) || node.match(/\[$/)) {
52                         indent = 1;
53                     } else if (node.match(/\}/) || node.match(/\]/)) {
54                         if (pad !== 0) {
55                             pad -= 1;
56                         }
57                     } else {
58                         indent = 0;
59                     }
60 
61                     for (i = 0; i < pad; i++) {
62                         padding += PADDING;
63                     }
64 
65                     formatted += padding + node + \'\r\n\';
66                     pad += indent;
67                 }
68         );
69         return formatted;
70     };
71     //引用示例部分
72     //(1)建立json格式或者從背景拿到對應的json格式
73     var originalJson = {"name": "binginsist", "sex": "男", "age": "25"};
74     //(2)調用formatJson函數,将json格式進行格式化
75     var resultJson = formatJson(originalJson);
76     //(3)将格式化好後的json寫入頁面中
77     document.getElementById("writePlace").innerHTML = \'<pre>\' +resultJson + \'<pre/>\';
78 </script>
79 </body>
80 </html>      

格式化xml執行個體:

1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>原生js格式化xml的方法</title>
 6 </head>
 7 <body>
 8 <!--格式化後的xml寫入的位置-->
 9 <div id="writePlace"></div>
10 <script>
11     //格式化代碼函數,已經用原生方式寫好了不需要改動,直接引用就好
12     String.prototype.removeLineEnd = function () {
13         return this.replace(/(<.+?\s+?)(?:\n\s*?(.+?=".*?"))/g, \'$1 $2\')
14     }
15     function formatXml(text) {
16         //去掉多餘的空格
17         text = \'\n\' + text.replace(/(<\w+)(\s.*?>)/g, function ($0, name, props) {
18                     return name + \' \' + props.replace(/\s+(\w+=)/g, " $1");
19                 }).replace(/>\s*?</g, ">\n<");
20 
21         //把注釋編碼
22         text = text.replace(/\n/g, \'\r\').replace(/<!--(.+?)-->/g, function ($0, text) {
23             var ret = \'<!--\' + escape(text) + \'-->\';
24             //alert(ret);
25             return ret;
26         }).replace(/\r/g, \'\n\');
27 
28         //調整格式
29         var rgx = /\n(<(([^\?]).+?)(?:\s|\s*?>|\s*?(\/)>)(?:.*?(?:(?:(\/)>)|(?:<(\/)\2>)))?)/mg;
30         var nodeStack = [];
31         var output = text.replace(rgx, function ($0, all, name, isBegin, isCloseFull1, isCloseFull2, isFull1, isFull2) {
32             var isClosed = (isCloseFull1 == \'/\') || (isCloseFull2 == \'/\' ) || (isFull1 == \'/\') || (isFull2 == \'/\');
33             //alert([all,isClosed].join(\'=\'));
34             var prefix = \'\';
35             if (isBegin == \'!\') {
36                 prefix = getPrefix(nodeStack.length);
37             }
38             else {
39                 if (isBegin != \'/\') {
40                     prefix = getPrefix(nodeStack.length);
41                     if (!isClosed) {
42                         nodeStack.push(name);
43                     }
44                 }
45                 else {
46                     nodeStack.pop();
47                     prefix = getPrefix(nodeStack.length);
48                 }
49 
50             }
51             var ret = \'\n\' + prefix + all;
52             return ret;
53         });
54 
55         var prefixSpace = -1;
56         var outputText = output.substring(1);
57         //alert(outputText);
58 
59         //把注釋還原并解碼,調格式
60         outputText = outputText.replace(/\n/g, \'\r\').replace(/(\s*)<!--(.+?)-->/g, function ($0, prefix, text) {
61             //alert([\'[\',prefix,\']=\',prefix.length].join(\'\'));
62             if (prefix.charAt(0) == \'\r\')
63                 prefix = prefix.substring(1);
64             text = unescape(text).replace(/\r/g, \'\n\');
65             var ret = \'\n\' + prefix + \'<!--\' + text.replace(/^\s*/mg, prefix) + \'-->\';
66             //alert(ret);
67             return ret;
68         });
69 
70         return outputText.replace(/\s+$/g, \'\').replace(/\r/g, \'\r\n\');
71     }
72     function getPrefix(prefixIndex) {
73         var span = \'    \';
74         var output = [];
75         for (var i = 0; i < prefixIndex; ++i) {
76             output.push(span);
77         }
78 
79         return output.join(\'\');
80     }
81 
82     //引用示例部分
83     //(1)建立xml格式或者從背景拿到對應的xml格式
84     var originalXml = \'<?xml version="1.0"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Dont forget me this weekend!</body> </note>\';
85     //(2)調用formatXml函數,将xml格式進行格式化
86     var resultXml = formatXml(originalXml);
87     //(3)将格式化好後的formatXml寫入頁面中
88     document.getElementById("writePlace").innerHTML = \'<pre>\' +resultXml + \'<pre/>\';
89 </script>
90 </body>
91 </html>