JSON使用函数参数序列化对象

我有这个C#对象:

var obj = new { username = "andrey", callback = "function(self) { return function() {self.doSomething()} (this) }" } 

我需要JSON序列化它以传递给ajax调用中的浏览器。 我使用JavascriptSerializer,但它序列化为以下JSON:

 {"username":"andrey", "callback": "function(self) { return function() {self.doSomething()} (this) }"} 

但我需要的是:

 {"username":"andrey", "callback": function(self) { return function() {self.doSomething()} (this) }} 
  • 函数定义没有引号。

现在,当JSON对象到达浏览器并创建时,’callback’参数不是函数而是字符串。 知道如何修复它,最好是在服务器端吗?

这种行为是故意的。 JSON不应包含任何非数据 – 在您的情况下是可执行函数。 如果数据可以从JSON格式的服务器返回,浏览器将面临巨大的安全风险,当执行时,将运行任意function(可以窃取信息,将用户重定向到恶意网站等)

JSON的早期实现依赖于以下事实:返回的数据可以通过eval()简单地执行以获取对象。 然而,人们几乎立即意识到这会带来巨大的安全风险,并一直试图处理它。 这就是为什么在标准化的JSON对象之前,人们停止将原始JSON数据放入eval()并使用JSON解析库。

JSON对象始终将对象序列化为仅数据。 这是设计的。 标准化的JSON格式无法表示可执行函数。

现在,您可以轻松地将浏览器上的回调转换为函数,方法是将其传递给eval()。 但是, 不要这样做 。 你只是打开自己的黑客攻击。

在服务器端,现代浏览器旨在防止发生这种事情 – 即从包含可执行function的浏览器发送数据。

我试图完成类似的事情。 在我的情况下,我使用MVC Razor语法尝试使用@ 语法生成一个传入函数的json对象。

我能够使用Json.net库(使用JsonConvert和JRaw)获得所需的输出。

例:

 // set the property value using JRaw var obj = new { username = "andrey", callback = new JRaw("function(self) { return function() {self.doSomething()} (this) }") } // and then serialize using the JsonConvert class var jsonObj = JsonConvert.SerializeObject(obj); 

那应该是你带有函数的json对象(而不是字符串中的函数)。

发布: 如何将函数序列化为json(使用razor @