2015-10-08 39 views
1

我讀過幾篇關於使用JSON.stringify的帖子來用JavaScript打印JSON字符串。但是,它似乎重新排序節點。我想有一個格式化的JSON對象,與提供的字符串的順序相同。漂亮的打印JSON保留屬性順序

這裏是我所得到使用規定的方法

爲例
var sJson = '{"2":"stuff", "1":"care"}'; 
alert(JSON.stringify(JSON.parse(sJson), null, 2)); 

結果:

{ 
    "1": "care", 
    "2": "stuff" 
} 

所需的結果:

{ 
    "2": "stuff", 
    "1": "care" 
} 

我很高興能使用外部庫如果JSON.stringify無法做到這一點。注意:我將從服務器開始使用縮小的JSON字符串。

+1

見http://stackoverflow.com/questions/24242441/does-json-stringify-preserves-order-of-objects-in-array和http://dev-answers.blogspot.com/2012 /03/javascript-object-keys-being-sorted-in.html。這導致另一個鏈接:http://stackoverflow.com/questions/5773950/how-to-keep-an-javascript-object-array-ordered-while-also-maintaining-key-lookup - 這提出了一個有趣的解決方案。 –

+0

如果有秩序的期望,爲什麼不嘗試實施某種某種? –

+2

對象在javascript中沒有順序,如果你想要訂單使用數組 – charlietfl

回答

0

我能夠移植我在this page上找到的php函數;它像一個冠軍一樣工作。

function pad(width, string, padding) { 
    return (width <= string.length) ? string : pad(width, padding + string, padding) 
} 

function json_pretty(json, html) 
{ 
    var 
     out = '', 
     nl = "\n", 
     cnt = 0, 
     tab = 4, 
     len = json.length, 
     space = ' '; 

    if(html == true) { 
     space = '&nbsp;'; 
     nl = '<br/>'; 
    } 

    k = space.length ? space.length : 1; 

    for (i=0; i<=len; i++) { 
     char = json.substring(i, i+1); 
     if(char == '}' || char == ']') { 
      cnt--; 
      out += nl + '' + pad(tab * cnt * k, '', space); 
     } 
     else if(char == '{' || char == '[') { 
      cnt++; 
     } 

     out += char; 
     if(char == ',' || char == '{' || char == '[') { 
      out += nl + pad(tab * cnt * k, '', space); 
     } 

     if(char == ':') { 
      out += ' '; 
     } 
    } 
    return out; 
} 
4

因爲在JavaScript中,對象沒有排序,對象中的屬性不能保持順序。爲了保持您的訂單,您需要將您的JSON更改爲使用數組:[{"2":"stuff"}, {"1":"care"}]