【问题标题】:Serialize as object using json.net使用 json.net 序列化为对象
【发布时间】:2010-12-20 22:07:13
【问题描述】:

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

{"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绑定

 $elem.bind(this.handlers);

接受戴夫的回答,因为这是最接近的。

【问题讨论】:

    标签: javascript c# serialization json.net dom-events


    【解决方案1】:

    JSON 不支持表示函数。 JSON 由值数组和对象(包含变量)组成。 JSON 中的值只能是字符串、数字、对象或数组(请参阅链接页面以获得漂亮的语法图)。

    您需要的是 javascript 代码,而不是 JSON 对象。如果您想发出对其他地方定义的函数的引用,您可能不得不(不寒而栗)使用eval 来执行它。

    【讨论】:

    • :) 试试吧!奇迹般有效!我有自己的班级可以做到这一点,只是我更喜欢使用 json.net。这是给我正在寻找的 json 的 sn-p: foreach (var item in collection) { StringBuilder.AppendFormat("\"{0}\":{1},", item.Key, item.价值); }
    • 您可能能够生成一些可以做到的东西,但它是不是 JSON。它恰好可以工作,但它不符合 JSON 规范,因此 json.net 没有这样做。
    • 我同意你不符合规范的观点,但在这种情况下我可以接受。请参阅下面我对@Dave 回答的评论,了解我可以接受的内容。我希望有一个更好的解决方案,所以如果你有一个,请提出。
    【解决方案2】:

    正如其他人所提到的,这无论如何都不是有效的 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]();
    

    【讨论】:

    • 我正在使用 jQuery 绑定来连接处理程序。我不想使用 eval ,因为这会引入安全考虑。我可以忍受 JSOn.parse 失败或者这不符合 JSON 标准。还是有更好的办法?
    • window[string] 不是 eval()。例如,尝试使用“alert('evil')”作为字符串值。说到 eval(),如果您成功地使用手动构建的无效 JSON 和未加引号的值,那几乎肯定会通过 eval() 反序列化,因为 JSON.parse 不会接受它。
    • 好吧!找到了一种方法来保持它与 JSON 兼容并使其与 jQuery 绑定一起工作。见我上面的编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多