我正在使用自定义JavaScriptConverter来序列化两个对象。其中一个是对象列表,它工作得很好;另一个是单个对象。 我将它们序列化并将它们放在页面的源代码中。当我在浏览器中查看HTML源代码时,我发现有效的代码如下所示:
var Object1 = '[{....}]';
虽然不起作用的那个看起来像这样:
var Object2 = '{...}';
当我运行eval时,它不能与Object2一起使用。我只是没有看到为什么序列化是不同的,因为我对两者都使用相同的原理;我显然做错了什么。如果您遇到类似问题或有建议,请告诉我。
感谢。
答案 0 :(得分:1)
您正在遇到解析歧义的Javascript。
而不是:
eval(json)
你需要:
eval('(' + json + ')')
在Javascript中,一个开放式大括号可以启动一个对象文字:
{ a: 0, b: 1 }
或块:
{ var a = 3; f(a); }
但是,块不能出现在表达式中,因此添加括号可以解决歧义。
答案 1 :(得分:1)
the spec第12.4节说:
ExpressionStatement无法启动 用开口大括号因为 这可能会使它与a模糊不清 块。还有一个ExpressionStatement 不能以function关键字开头 因为这可能会使它模棱两可 使用FunctionDeclaration。
这里讨论了许多解决方法/解决方案:
答案 2 :(得分:0)
没有什么奇怪的。在JSON中,您有普通对象,用{ ... }
表示,普通对象列表用[{ ... }, { ... }, ...]
和。因此,如果您的第二个对象不是列表,则不能指望它如此序列化。如果您希望第二个对象用[]
括起来,您可以创建一个包含一个元素的列表,该列表是第二个对象,然后序列化该列表。