2010-12-20 45 views
3

我希望将某些属性序列化为“对象”而不是字符串。例如。使用json.net序列化为对象

{ “onClickHandler”:OnClickHandler, “的onmouseout”:OnMouseOutHandler}

类DEF是这样的:

public class handlers { 

    public string OnClickHandler; 
    public string OnMouseOutHandler; 

} 

目前它出来为:

处理程序:{“onClickHandler”:“OnClickHandler”, “onMouseO ut“:”OnMouseOutHandler“}

正如您所能猜到的,这些是客户端事件处理程序,并且与其他地方定义的javascript函数相对应。通过在引号内发出它们,它们不会被解释为函数,而会被解释为文字字符串。

编辑:

得到暗示了戴维的答案,想出了一个办法:

for (var handler in this.handlers) { 
    if(window[this.handlers[handler]]) 
     this.handlers[handler] = window[this.handlers[handler]]; 
}; 

,然后调用jQuery的绑定:

第一擦洗一点点通常为

$elem.bind(this.handlers); 

接受Dave最接近的答案。

回答

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](); 
+0

我使用jQuery绑定来连接处理程序。我不想使用eval,因为这会引入安全考虑。我可以忍受JSOn.parse失败或这是不符合JSON的。或者,还有更好的方法? – Mrchief 2010-12-21 17:06:35

+0

window [string]不是eval()。例如,以“alert('evil')”作为字符串值来尝试。说到eval(),如果您成功使用手动构建的无效JSON和未引用的值,那么几乎肯定会通过eval()进行反序列化,因为JSON.parse不会接受它。 – 2010-12-21 18:05:33

+0

好的!想出了一个方法来保持JSON兼容,并使其与jQuery绑定一起工作。看到我上面的编辑。 – Mrchief 2011-01-03 16:59:09

2

JSON不支持表示功能。 JSON由值的数组和包含变量的对象组成。 JSON中的值只能是字符串,数字,对象或数组(请参阅良好语法图的链接页面)。

你在追求的是JavaScript代码,而不是JSON对象。如果你想发布对其他地方定义的函数的引用,你可能不得不(不寒而栗)使用eval来执行它。

+0

:)试试吧!奇迹般有效!我有我自己的类可以做到这一点,只是我更喜欢使用json.net。下面是我要找的json代码片段:foreach(var collection in collection) StringBuilder.AppendFormat(“\”{0} \“:{1},”,item.Key,item。值); } – Mrchief 2010-12-20 22:26:03

+1

您可能能够生成某些内容,但它不是* JSON。它恰好工作,但它不符合JSON规范,因此,json.net没有这样做。 – developmentalinsanity 2010-12-20 22:34:55

+0

我同意你不遵守规范,但我可以忍受这种情况。在下面看到我的评论@戴夫的答案,在这里我可以接受什么。我宁愿有一个更好的解决方案,所以如果你有一个,请建议。 – Mrchief 2010-12-21 17:08:42