代码之家  ›  专栏  ›  技术社区  ›  Ben Combee

可以在JSON对象中使用尾随逗号吗?

  •  341
  • Ben Combee  · 技术社区  · 17 年前

    手动生成JSON对象或数组时,在对象或数组的最后一项上留下逗号通常更容易。例如,从字符串数组输出的代码可能看起来像(在C++中类似伪代码):

    s.append("[");
    for (i = 0; i < 5; ++i) {
        s.appendF("\"%d\",", i);
    }
    s.append("]");
    

    给你一根像

    [0,1,2,3,4,5,]
    

    允许这样做吗?

    15 回复  |  直到 8 年前
        1
  •  281
  •   chharvey    11 年前

    the JSON specification 不允许尾随逗号。有一些浏览器会允许它,但通常你需要担心所有的浏览器。

    通常,我会尝试扭转这个问题,并在实际值之前添加逗号,因此最终的代码如下所示:

    s.append("[");
    for (i = 0; i < 5; ++i) {
      if (i) s.append(","); // add the comma only if this isn't the first entry
      s.appendF("\"%d\"", i);
    }
    s.append("]");
    

    for循环中额外的一行代码几乎不贵。。。

    当从某种形式的字典将结构输出到JSON时,我使用的另一种方法是,总是在每个条目后附加一个逗号(如上所述),然后在末尾添加一个没有尾随逗号的伪条目(但这只是懒惰;->)。

    不幸的是,不能很好地处理数组。

        2
  •  137
  •   Ben Combee    10 年前

    不是。JSON规范,在 http://json.org ,不允许尾随逗号。据我所见,一些解析器在读取JSON字符串时可能会默默地允许它们,而其他解析器则会抛出错误。对于互操作性,您不应该包括它。

        3
  •  112
  •   iconoclast    11 年前

    简单、便宜、易于阅读,无论规格如何,都能正常工作。

    $delimiter = '';
    for ....  {
        print $delimiter.$whatever
        $delimiter = ',';
    }
    

    给$delim的多余任务付出的代价很小。 如果没有显式循环,只有单独的代码片段,也同样有效。

        4
  •  23
  •   Community Mohan Dere    4 年前

    JavaScript中允许尾随逗号,但IE中不允许尾随逗号。Douglas Crockford的无版本JSON规范不允许尾随逗号,因为它是无版本的,所以不应该更改。ES5JSON规范允许它们作为扩展,但是Crockford RFC 4627 没有,ES5恢复了对它们的禁止。 Firefox

        5
  •  16
  •   user719662 user719662    9 年前

    如前所述,JSON规范(基于ECMAScript 3)不允许尾随逗号。ES>=5允许它,所以您可以在纯JS中实际使用该符号。这是有争议的,还有一些解析器 http://bolinfest.com/essays/json.html http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas-no-longer-accepted/ http://json.org/ )是吗

    ... 我想知道为什么没有人指出实际上可以在第0次迭代时分割循环并使用 主要的 逗号而不是后面的逗号,以消除比较代码的味道和循环中的任何实际性能开销,从而使代码实际上比提出的其他解决方案更短、更简单、更快(因为循环中没有分支/条件)。

    例如(在类似于OP建议代码的C样式伪代码中):

    s.append("[");
    // MAX == 5 here. if it's constant, you can inline it below and get rid of the comparison
    if ( MAX > 0 ) {
        s.appendF("\"%d\"", 0); // 0-th iteration
        for( int i = 1; i < MAX; ++i ) {
            s.appendF(",\"%d\"", i); // i-th iteration
        }
    }
    s.append("]");
    
        6
  •  11
  •   NullUserException Mark Roddy    14 年前

    PHP程序员可能想查看一下 . 这需要一个数组使用字符串将其连接起来。

    docs

    $array = array('lastname', 'email', 'phone');
    echo implode(",", $array); // lastname,email,phone
    
        7
  •  9
  •   James Curran    17 年前

    有趣的是,C&C++(我认为C,但我不确定)具体允许后面逗号-确切地给出理由:它使编程生成列表变得更容易。不知道为什么JavaScript没有跟随他们。

        8
  •  6
  •   user619271    11 年前

    使用JSON5。不要使用JSON。

    • 对象和数组可以有尾随逗号
    • 如果对象键是有效标识符,则可以将其取消引用
    • 字符串可以跨多行拆分
    • 数字可以是十六进制(以16为基数)
    • 数字可以以(前导或尾随)小数点开始或结束。
    • 数字可以包括无限和-无限。
    • 数字可以以明确的加号(+)开头。

    http://json5.org/

    https://github.com/aseemk/json5

        9
  •  3
  •   Zhang Boyang    7 年前

    有一种可能的方法可以避免循环中的if分支。

    s.append("[ "); // there is a space after the left bracket
    for (i = 0; i < 5; ++i) {
      s.appendF("\"%d\",", i); // always add comma
    }
    s.back() = ']'; // modify last comma (or the space) to right bracket
    
        10
  •  3
  •   Beni Cherniavsky-Paskin    5 年前

    不,是《铁路图》 https://json.org 是规范的精确翻译,并明确说明 , 总是先于 value ,以前从未有过 ]

    railroad diagram for array

    } :

    railroad diagram for object

        11
  •  3
  •   Roland    4 年前

    我宁愿申请,也不愿参加辩论俱乐部 Defensive Programming

    • 作为一个应用程序的开发者 收到 轻松的 尾随逗号。

    • 在开发应用程序时 我会的 严格的 并使用其他答案中的一种巧妙技巧,仅在项目和之间添加逗号 避免 尾随逗号。

    还有更大的问题需要解决。。。

        12
  •  2
  •   Community Mohan Dere    4 年前

    根据 Class JSONArray specification :

    • 右括号前可能会出现一个额外的(逗号)。
    • 当存在(逗号)省略时,将插入空值。

    因此,据我理解,应该允许它写:

    [0,1,2,3,4,5,]
    

    但有些解析器可能会返回7作为项目计数(如Daniel Earwicker指出的IE8),而不是预期的6。


    我找到了这个 JSON Validator 对JSON字符串进行验证 RFC 4627 (JavaScript对象表示法的应用程序/json媒体类型)和JavaScript语言规范。实际上,在这里,带尾随逗号的数组仅对JavaScript有效,而对RFC4627规范无效。

    然而,RFC 4627规范中规定:

    2.3. 阵列

    一个或多个值(或元素)。元素之间用逗号分隔。

    array = begin-array [ value *( value-separator value ) ] end-array
    

    元素之间用逗号分隔 (无需说明特殊情况,如最后一个元素),可以从两个方面理解。

    RFC 7159

        13
  •  1
  •   Steven Spungin    8 年前

    或者干脆省去逗号

    看看轻松的JSON规范,您将看到原始JSON规范有多“嘈杂”。逗号和引号太多了。。。

    http://www.relaxedjson.org

    您还可以使用这个在线RJSON解析器来尝试您的示例,并看到它被正确解析。

    http://www.relaxedjson.org/docs/converter.html?source=%5B0%2C1%2C2%2C3%2C4%2C5%2C%5D

        14
  •  1
  •   theking2    6 年前

    var a = Array()
    for(let i=1; i<=5; i++) {
        a.push(i)
    }
    var s = "[" + a.join(",") + "]"
    

    (在Firefox、Chrome、Edge、IE11中运行良好,在IE9、8、7、5中没有let)

        15
  •  0
  •   dnshio    14 年前

    根据我过去的经验,我发现不同的浏览器处理JSON中尾随逗号的方式不同。

    Firefox和Chrome都能很好地处理它。但IE(所有版本)似乎都崩溃了。我的意思是真的休息一下,别再看剩下的剧本了。

    请记住这一点,以及编写兼容代码总是很好这一事实,我建议花费额外的精力确保没有尾随逗号。

        16
  •  0
  •   Animism Adam Waite    13 年前

    我保留一个当前计数,并将其与总计数进行比较。如果当前计数小于总计数,则显示逗号。

    如果在执行JSON生成之前没有总计数,则可能无法工作。

    同样,如果您使用的是PHP5.2.0或更高版本,您可以使用内置的JSON API格式化响应。

        17
  •  0
  •   feibing    8 年前

    不建议这样做,但您仍然可以这样做来解析它。

    jsonStr = '[0,1,2,3,4,5,]';
    let data;
    eval('data = ' + jsonStr);
    console.log(data)
        18
  •  0
  •   Gregory Horne 07AD    7 年前

    由于for循环用于迭代数组或类似的可重用数据结构,因此我们可以使用数组的长度,如图所示,

    awk -v header="FirstName,LastName,DOB" '
      BEGIN {
        FS = ",";
        print("[");
        columns = split(header, column_names, ",");
      }
      { print("  {");
        for (i = 1; i < columns; i++) {
          printf("    \"%s\":\"%s\",\n", column_names[i], $(i));
        }
        printf("    \"%s\":\"%s\"\n", column_names[i], $(i));
        print("  }");
      }
      END { print("]"); } ' datafile.txt
    

    datafile.txt包含,

     Angela,Baker,2010-05-23
     Betty,Crockett,1990-12-07
     David,Done,2003-10-31
    
        19
  •  -1
  •   Nils    17 年前

    我通常在数组上循环,并在字符串中的每个条目后附加一个逗号。循环结束后,我再次删除最后一个逗号。

    也许不是最好的方法,但比每次检查它是否是循环中的最后一个对象要便宜。

    推荐文章