2010-12-20 46 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