首页 文章

是否保留了JSON列表中元素的顺序?

提问于
浏览
181

我注意到JSON对象中元素的顺序不是原始顺序 .

那些JSON列表的元素呢?他们的订单是否保持?

5 回答

  • 3

    实际上,如果密钥是NaN类型,浏览器将不会更改顺序 .

    以下脚本将输出“One”,“Two”,“Three”:

    var foo={"3":"Three", "1":"One", "2":"Two"};
    for(bar in foo) {
        alert(foo[bar]);
    }
    

    以下脚本将输出“Three”,“One”,“Two”:

    var foo={"@3":"Three", "@1":"One", "@2":"Two"};
    for(bar in foo) {
        alert(foo[bar]);
    }
    
  • 279

    是的,保留了JSON数组中元素的顺序 . 来自RFC 7159 -The JavaScript Object Notation (JSON) Data Interchange Format(强调我的):

    对象是零个或多个名称/值对的无序集合,其中名称是字符串,值是字符串,数字,布尔值,空值,对象或数组 . 数组是零个或多个值的有序序列 . 术语“对象”和“数组”来自JavaScript的约定 .

  • 8

    保持数组中元素的顺序( [] ) . "object"( {} )中的元素(名称:值对)的顺序不是,并且它们通常是"jumbled",如果不是JSON格式化程序/解析器本身,那么特定于语言的对象(Dictionary,NSDictionary,Hashtable)等)用作内部表示 .

  • 5

    一些JavaScript引擎将密钥保持在插入顺序中 . 例如,V8,keeps all keys in insertion order except for keys that can be parsed as unsigned 32-bit integers .

    这意味着如果您运行以下任一项:

    var animals = {};
    animals['dog'] = true;
    animals['bear'] = true;
    animals['monkey'] = true;
    for (var animal in animals) {
      if (animals.hasOwnProperty(animal)) {
        $('<li>').text(animal).appendTo('#animals');
      }
    }
    
    var animals = JSON.parse('{ "dog": true, "bear": true, "monkey": true }');
    for (var animal in animals) {
      $('<li>').text(animal).appendTo('#animals');
    }
    

    在使用V8的Chrome上,您将始终按顺序获得狗,熊和猴子 . Node.js也使用V8 . 即使你有数以千计的物品,这也是正确的 . YMMV与其他JavaScript引擎 .

    演示herehere .

  • 50

    “是否维护了JSON列表中元素的顺序?”这不是一个好问题 . 您需要询问“在执行[...]时是否保留了JSON列表中元素的顺序?”正如Felix King所指出的,JSON是一种文本数据格式 . 没有理由它不会变异 . 不要将JSON字符串与(JavaScript)对象混淆 .

    你可能在谈论像 JSON.stringify(JSON.parse(...)) 这样的操作 . 现在答案是:这取决于实施 . 99%*的JSON解析器不维护对象的顺序,并且保持数组的顺序,但您也可以使用JSON来存储类似的东西

    {
        "son": "David",
        "daughter": "Julia",
        "son": "Tom",
        "daughter": "Clara"
    }
    

    并使用维护对象顺序的解析器 .

    *可能更多:)

相关问题