json和eval的问题

时间:2009-11-19 05:14:10

标签: c# javascript json

我似乎无法在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());

然而,在我执行eval的Javascript中,我收到了错误;

预期']';

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

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

我应该提一下,该项目是.Net 2.0,我只是返回一个序列化的对象w / out所有JSON guff并且它工作正常。

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

任何人都知道发生了什么以及如何解决它?

4 个答案:

答案 0 :(得分:0)

虽然我不是100%肯定,但我相信问题出现在你的序列化对象中。

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

可能eval函数被“在那里弄糊涂了。你有没有尝试将其改为'?

答案 1 :(得分:0)

首先,我不确定C#

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

return Encoding.Default.GetString(ms);

答案 2 :(得分:0)

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

如果我的记忆正确地为我服务,请尝试以下方法 尝试在客户端上使用不同的反序列化器。例如来自http://www.json.org/json_parse.js

的Json Parse

如果仍然无效。在服务器上尝试不同的序列化程序。 Json.NET是免费的,可以对您希望序列化数据的方式进行大量控制:http://www.codeplex.com/Json

或者我可能只需要将请求的MimeType设置为仅文本而不是HTML。

答案 3 :(得分:0)

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

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

msg 强制转换为字符串,并将对象强制转换为字符串会返回“[object Object]”以获取您所拥有的简单哈希值。因此,使用括号,您最终得到:

"([object Object])"

Eval'ing这是一个完整的语法错误。

正如odge建议的那样,要么删掉“eval”,要么删除“json”dataType。