在javascript对象表示法中尾随逗号和/或非existant键ok?

时间:2011-07-14 01:39:19

标签: javascript json

我做了一个小代码,并想知道我是否应该在最后处理额外的逗号。 IE似乎忽略了它,但我需要将它保持在浏览器之间,我还是想生成有效的代码。

function init() {
var myOptions = { : 'Select home value', // <== THERE'S THE NON EXISTANT KEY
100000 : '$90,001 - $100,000',
1000000 : '$950,001 - $1,000,000',
1000001 : 'Over $1,000,000', // <== HERE'S THE COMMA I'M CURIOUS ABOUT
};

这是生成

的代码
protected string DoTransform()
{
    var sb = new StringBuilder("var myOptions = {");
    foreach (var option in 
        XDocument.Load(MapPath("~/App_Data/Data.xml"))
            .XPathSelectElements("./data/options[@question='ApproximatePropertyValue']/option"))
    {
        sb.AppendFormat("{0} : '{1}',\n", option.Attribute("value").Value, option.Value);
    }
    sb.AppendLine("};");
    return sb.ToString();
}

解答: 这是更新的代码,它处理空键(通过跳过第一个元素)和尾随逗号(通过重新排列逻辑,以便TrimEnd可以捕获它)。

protected string DoTransform()
{
    var sb = new StringBuilder();
    foreach (var option in 
        XDocument.Load(MapPath("~/App_Data/Data.xml"))
            .XPathSelectElements("./data/options[@question='ApproximatePropertyValue']/option")
            .Skip(1))
    {
        sb.AppendFormat("{0}:'{1}',", option.Attribute("value").Value, option.Value);
    }
    return"var myOptions = {\n" + sb.ToString().TrimEnd(',') + "};";
}

4 个答案:

答案 0 :(得分:2)

我的理解是大多数浏览器都会允许使用尾随逗号,但它不是JSON规范中可接受的内容,因此它是 bad idea 。另一方面,你错过了第一个键值对中的键的事实将不会被原谅......任何人; - )

修改

刚看到上面的代码。原谅我,我的.NET生锈了(因为,我几乎没看过它),但我相信这会有效:

foreach (var option in 
    XDocument.Load(MapPath("~/App_Data/Data.xml"))
       .XPathSelectElements(
             "./data/options[@question='ApproximatePropertyValue']/option"
       )
    )
{
    // use the length as a flag, if you've added to it, it will be longer than 16
    if(sb.Length > 20)sb.Append(",");
    sb.AppendFormat("\n{0} : '{1}'", 
        option.Attribute("value").Value, option.Value);
}

答案 1 :(得分:2)

Opera 12说:

[14.07.2011 03:44:53] JavaScript - ...
Inline script compilation
Syntax error at line 6 while loading:
  var myOptions = {: 'Select home value
-------------------^
expected '}', got ':'

你最好在这里寻找一个库:http://json.org/而不是再次实现轮子。

(请不要告诉任何人我给你那个糟糕的hacky建议:)你可以在{s}附加sentinel "_ignore_me": false

答案 2 :(得分:0)

至少IE7及更早版本的尾随逗号会出现问题。在较新的版本中,它取决于文档模式。

答案 3 :(得分:-1)

IE不喜欢尾随逗号。其他浏览器都可以。