我有这个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格式从服务器返回,则该浏览器将面临巨大的安全风险,该JSON格式在执行时将运行任意功能(可以窃取信息,将用户重定向到恶意站点等)。
JSON的早期实现依赖这样一个事实,即返回的数据可以简单地通过eval()执行以获取对象。但是,人们几乎 立即 意识到这带来了巨大的安全风险,并且此后一直在设法加以解决。这就是为什么在标准化JSON对象之前,人们停止将原始JSON数据放入eval()并使用JSON解析库的原因。
JSON对象将始终仅将对象序列化为数据。这是设计使然。标准化JSON格式无法表示可执行函数。
现在,您可以通过将回调传递给eval()轻松地将其在浏览器上转换为函数。但是, 请不要这样做 。您只是在为黑客开放自己。
在服务器端,现代浏览器旨在防止发生这种确切的事情,即从包含可执行功能的浏览器发送数据。