【问题标题】:problem with json and evaljson和eval的问题
【发布时间】:2009-11-19 05:14:09
【问题描述】:

我似乎无法在 SO 中找到任何解决方案,所以就这样吧。

我在页面的 C# 中调用了一个 WebMethod,如下所示;

$.ajax({
    type: "POST",
    url: "MyWebPage.aspx/jQueryMyWebMethod",
    data: "{FamilyType:'" + $('.HdnFamilyType').val() + "'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(msg) {
        var obj = eval('(' + msg + ')');
    }
});

在后面的代码中我创建了一个对象,序列化它并像这样返回它;

LHCRequiredFormViewModel fvm = new LHCRequiredFormViewModel();
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(LHCRequiredFormViewModel));
MemoryStream ms = new MemoryStream( );
ser.WriteObject(ms, fvm);
return Encoding.Default.GetString(ms.ToArray());

但是,在 Javascript 中,当我执行 eval 时出现错误;

预期为 ']';

在从 C# 返回序列化对象时,数据看起来像;

"{\"<IsApplicantLHCRequired>k__BackingField\":true,\"<IsPartnerLHCRequired>k__BackingField\":false}"    string

我应该提一下,该项目是 .Net 2.0,我只是返回了一个序列化的对象,不包含所有 JSON 数据,它运行良好。

然后我转换到 3.5 并且问题开始了。那时我使用了 JsonSerializer,但仍然遇到完全相同的错误。

有人知道发生了什么以及如何解决吗?

【问题讨论】:

  • 由于您使用的是 jQuery 并且您已将数据类型设置为 JSON,因此 msg 变量应该已经是 JSON 对象。应该不需要 eval()。
  • 我同意,但是当我尝试这样做时,我仍然无法获得对象中的属性。我已将该项目带回 2.0,稍后将在时间/金钱允许时进一步调查。我将使用 FireBug 深入挖掘。谢谢@Odge

标签: c# javascript json


【解决方案1】:

很久以前,我遇到过类似的问题。不幸的是,那是很久以前的事了,我不记得我是如何修复它的。我只知道根本原因是从旧版本的 .NET 升级到 3.5。

如果我没记错的话,试试这些: 尝试在客户端上使用不同的反序列化程序。比如来自http://www.json.org/json_parse.js的Json Parse

如果还是不行的话。在服务器上尝试不同的序列化程序。 Json.NET 是免费的,并且可以对如何序列化数据提供很多控制:http://www.codeplex.com/Json

或者也许我只需要将请求的 MimeType 设置为纯文本而不是 HTML。

【讨论】:

    【解决方案2】:

    虽然我不能 100% 确定,但我相信问题出在您的序列化对象上。

        "{\"<IsApplicantLHCRequired>k__BackingField\":true,\"<IsPartnerLHCRequired>k__BackingField\":false}"
    

    可能 eval 函数被其中的 \" 弄糊涂了。您是否尝试将其更改为 ' ?

    【讨论】:

    • 序列化对象原样,由序列化注释创建。鉴于命令应该给我适当的序列化数据,我有点犹豫它是否进行替换。我怀疑问题不在于后端,而在于用户界面。我只是不认为我的 javascript 代码正确
    【解决方案3】:

    首先,我不确定 C#

    但是你可以尝试将ms.ToArray() 更改为ms

    return Encoding.Default.GetString(ms);
    

    【讨论】:

      【解决方案4】:

      对于 jQuery.ajax,当您使用 json 作为数据类型时,这意味着“对我来说评估这个,因为它是 JSON”,并且成功回调的参数将是一个对象。所以你有这个对象,你将它与一个字符串连接起来。

      eval('(' + msg + ')');
      

      这会将 msg 强制转换为字符串,并将对象强制转换为字符串会返回“[object Object]”,就像您拥有的简单哈希一样。所以用括号你最终得到:

      "([object Object])"
      

      评估这是一个完全的语法错误。

      正如 odge 所建议的,要么删除“eval”,要么删除“json”数据类型。

      【讨论】:

        猜你喜欢
        • 2011-04-12
        • 2013-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-28
        • 1970-01-01
        • 2020-06-22
        相关资源
        最近更新 更多