我做了一个小代码,并想知道我是否应该在最后处理额外的逗号。 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(',') + "};";
}
答案 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不喜欢尾随逗号。其他浏览器都可以。