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

Javascript 漂亮的打印JSON保留属性顺序,javascript,json,formatting,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" } 预期结果: {

我读过几篇关于使用
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字符串开始。

因为在JavaScript中,对象没有顺序,对象中的属性没有顺序。为了保持秩序,您需要将JSON改为使用数组:
[{“2”:“stuff”},{“1”:“care”}]

我能够移植在上找到的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;
}
功能板(宽度、字符串、填充){

return(width关于显示的JSON格式,我们有一个类似的问题。有两个强大的解决方案:

  • 该软件包提供解析、格式化和漂亮的打印,具有稳定的顺序。这是基于有顺序的输入
  • 该包提供基于排序的确定格式

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

请参阅和。这导致另一个链接:--这是一个有趣的解决方案。如果对顺序有一些期望,为什么不尝试实现某种排序?javascript中的对象没有顺序,如果您想使用数组^Sin排序ce在对象上迭代并不能维持顺序,将字符串解析为JS对象可能不是最好的主意。@charlietfl:而是使用一个可以格式化JSON而不转换为JS对象的库。问题是如何漂亮地打印JSON,这意味着它是供人使用的。我们都知道顺序对程序来说并不重要,b但有时程序可能会以特定的顺序将JSON数据写入文件,这种顺序对人类可能有意义。此代码段不需要检查“双引号开始/结束字符串值,并将中断(产生错误的输出)当它遇到字符串中的大括号/方括号时。请参阅JSON规范作为参考:对我来说,最新版本的chrome上仍然存在原始问题。您介意使用
JSON顺序和原始问题字符串(
'{“2”:“stuff”,“1”:“care”}更新您的答案吗,我很乐意接受这个正确答案。