我希望将某些属性序列化为“对象”而不是字符串。 E.g。
{“onClickHandler”:OnClickHandler, “onMouseOut”:OnMouseOutHandler}
类def是这样的:
public class handlers {
public string OnClickHandler;
public string OnMouseOutHandler;
}
目前它出现:
处理程序:{“onClickHandler”:“OnClickHandler”, “onMouseOut”:“OnMouseOutHandler”}
您可以猜到,这些是客户端事件处理程序,对应于其他地方定义的javascript函数。通过在引号内发出它们,它们不会被解释为函数,而是解释为文字字符串。
修改:
从戴夫的回答中得到一个提示,想出办法:
先擦洗一下:
for (var handler in this.handlers) {
if(window[this.handlers[handler]])
this.handlers[handler] = window[this.handlers[handler]];
};
然后正常调用jQuery bind
$elem.bind(this.handlers);
接受戴夫的答案,因为那是最接近的。
答案 0 :(得分:2)
JSON不支持代表函数。 JSON由值数组和对象(包含变量)组成。 JSON中的值只能是字符串,数字,对象或数组(请参阅链接页面以获得精美的语法图表。)
你所追求的是javascript代码,而不是JSON对象。如果您想要发出对其他地方定义的函数的引用,您可能不得不(颤抖)使用eval
来执行它。
答案 1 :(得分:1)
正如其他人提到的那样,无论如何都不是有效的JSON(这会阻止你使用JSON.parse(),以及其他潜在的缺点)。
如果在全局窗口范围内定义了事件处理函数,则可以这样调用它们:
// This is equivalent to defining window.clickEventHandler or
// window['clickEventHandler'] as a function variable.
function clickEventHander() {
// Magic.
}
// Valid JSON, using strings to reference the handler's name.
var json = '{"onClickHandler": "clickEventHandler"}'
// You might be using eval() or a framework for this currently.
var handlerMappings = JSON.parse(json);
window[handlerMappings.onClickHandler]();