漂亮的打印JSON保留属性顺序

时间:2015-10-08 01:27:18

标签: javascript json formatting

我已经阅读了几篇关于使用JSON.stringify来使用Javascript打印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字符串。

3 个答案:

答案 0 :(得分:4)

因为在JavaScript对象中没有排序,所以Object中的属性不会保留顺序。为了保留您的订单,您需要更改JSON以使用数组:[{"2":"stuff"}, {"1":"care"}]

答案 1 :(得分: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;
}

答案 2 :(得分:-1)

我们有一个关于显示的 JSON 格式的类似问题。有几个强大的解决方案可用:

我对 Chrome 的快速测试还发现 JSON.parse() 似乎 保留了顺序;这涵盖了大部分浏览器市场(Chrome、Edge 等),但不能保证在其他浏览器上使用。这可能会提供一种廉价的部分解决方案,但并不完全可靠。