问题 json响应包含\ n \ r


我在客户端使用ASP.NET和jQuery。

我在用着 Json.NET 从服务器端的DB序列化数据,并在Ajax请求到达时将其发送到客户端。

当我打开FireBug时,我看到以下json:

{"d":"[\r\n  {\r\n    \"CategoryID\": 1,\r\n    \"CategoryName\": \"a\",\r\n    \"Description\": \"123\",\r\n    \"CategoryType\": \"Personal\",\r\n    \"Traits\": [\r\n      {\r\n        \"TraitID\": 1,\r\n        \"TraitName\": \"a\",\r\n        \"Description\": \"aaa\"\r\n      },\r\n      {\r\n        \"TraitID\": 1,\r\n        \"TraitName\": \"a\",\r\n        \"Description\": \"aaa\"\r\n      }\r\n    ]\r\n  },\r\n  {\r\n    \"CategoryID\": 1,\r\n    \"CategoryName\": \"b\",\r\n    \"Description\": \"bla bla\",\r\n    \"CategoryType\": \"Professional\",\r\n    \"Traits\": [\r\n      {\r\n        \"TraitID\": 1,\r\n        \"TraitName\": \"a\",\r\n        \"Description\": \"aaa\"\r\n      },\r\n      {\r\n        \"TraitID\": 1,\r\n        \"TraitName\": \"a\",\r\n        \"Description\": \"aaa\"\r\n      }\r\n    ]\r\n  },\r\n  {\r\n    \"CategoryID\": 1,\r\n    \"CategoryName\": \"c\",\r\n    \"Description\": \"123\",\r\n    \"CategoryType\": \"Personal\",\r\n    \"Traits\": [\r\n      {\r\n        \"TraitID\": 1,\r\n        \"TraitName\": \"a\",\r\n        \"Description\": \"aaa\"\r\n      },\r\n      {\r\n        \"TraitID\": 1,\r\n        \"TraitName\": \"a\",\r\n        \"Description\": \"aaa\"\r\n      }\r\n    ]\r\n  },\r\n  {\r\n    \"CategoryID\": 1,\r\n    \"CategoryName\": \"d\",\r\n    \"Description\": \"bla bla\",\r\n    \"CategoryType\": \"Professional\",\r\n    \"Traits\": [\r\n      {\r\n        \"TraitID\": 1,\r\n        \"TraitName\": \"a\",\r\n        \"Description\": \"aaa\"\r\n      },\r\n      {\r\n        \"TraitID\": 1,\r\n        \"TraitName\": \"a\",\r\n        \"Description\": \"aaa\"\r\n      }\r\n    ]\r\n  }\r\n]"}

我的服务器端代码:

    [WebMethod]
public static string LoadRatingForm()
{
    bll_Trait t1 = new bll_Trait();
    t1.TraitID = 1;
    t1.TraitName = "a";
    t1.Description = "aaa";

    bll_Trait t2 = new bll_Trait();
    t2.TraitID = 1;
    t2.TraitName = "a";
    t2.Description = "aaa";

    bll_Trait t3 = new bll_Trait();
    t3.TraitID = 1;
    t3.TraitName = "a";
    t3.Description = "aaa";

    bll_Trait t4 = new bll_Trait();
    t4.TraitID = 1;
    t4.TraitName = "a";
    t4.Description = "aaa";



    bll_Category c1 = new bll_Category();
    c1.CategoryID = 1;
    c1.CategoryName = "a";
    c1.CategoryType = "Personal";
    c1.Description = "123";
    c1.Traits.Add(t1);
    c1.Traits.Add(t2);

    bll_Category c2 = new bll_Category();
    c2.CategoryID = 1;
    c2.CategoryName = "b";
    c2.CategoryType = "Professional";
    c2.Description = "bla bla";
    c2.Traits.Add(t3);
    c2.Traits.Add(t4);

    bll_Category c3 = new bll_Category();
    c3.CategoryID = 1;
    c3.CategoryName = "c";
    c3.CategoryType = "Personal";
    c3.Description = "123";
    c3.Traits.Add(t1);
    c3.Traits.Add(t2);

    bll_Category c4 = new bll_Category();
    c4.CategoryID = 1;
    c4.CategoryName = "d";
    c4.CategoryType = "Professional";
    c4.Description = "bla bla";
    c4.Traits.Add(t3);
    c4.Traits.Add(t4);

    List<bll_Category> list = new List<bll_Category>();
    list.Add(c1);
    list.Add(c2);
    list.Add(c3);
    list.Add(c4);

    return JsonConvert.SerializeObject(list, Formatting.Indented);
}

我的jQuery代码:

$.ajax({
            type: "POST",
            url: "MyProfile.aspx/LoadRatingForm",
            data: "{}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (response) {
                var html;
                var categories = response.d;
                $.each(categories, function (i, category) {
                    // create 
                    //while (category.CategoryType == "Professional") {
                    //
                    //}

                    html += category.CategoryName + " ";
                });
                dialog.append(html);
            },
            error: function () {
                alert("ERROR");
            }
        });

'dialog'变量是一个jQuery UI模式对话框,$ .ajax代码位于对话框的'open'事件处理程序中...

如何在不使用'\ n','\ r'和'\'的情况下使序列化结果成为“正确”的json格式?

提前致谢!


12577
2018-05-24 21:12


起源



答案:


您不应该手动JSON序列化该List。

当您通过POST调用它并使用内容类型时,ASP.NET已经自动为您执行此操作 application/json。所以,你最终会得到一个双重序列化的响应,这就是为什么你发现你需要在jQuery已经解析过一次之后再次解析它。

如果使用返回类型的List并直接返回列表,则应该处于良好状态。

更多信息: http://encosia.com/2011/04/13/asp-net-web-services-mistake-manual-json-serialization/


8
2018-05-25 01:01



谢谢你的意见:)你帮了我很多忙! - Sash


答案:


您不应该手动JSON序列化该List。

当您通过POST调用它并使用内容类型时,ASP.NET已经自动为您执行此操作 application/json。所以,你最终会得到一个双重序列化的响应,这就是为什么你发现你需要在jQuery已经解析过一次之后再次解析它。

如果使用返回类型的List并直接返回列表,则应该处于良好状态。

更多信息: http://encosia.com/2011/04/13/asp-net-web-services-mistake-manual-json-serialization/


8
2018-05-25 01:01



谢谢你的意见:)你帮了我很多忙! - Sash


你可以试试 return JsonConvert.SerializeObject(list, Formatting.None);

你看过这个相关的问题吗? ASP.NET + jQuery,如何deSerialize JSON?。可能与Content-Type标头有关。

编辑:看到评论,没有解析JSON。


7
2018-05-24 21:24



谢谢你的链接,但它对我没有帮助...... - Sash
我是否遗漏了某些内容或者您不必先将其解析为对象? - ColWhi
你当然是对的!我添加了$ .parseJSON,现在一切正常......非常感谢!!! - Sash


根据JSON规范:“可以在任何一对令牌之间插入空格。”

http://www.json.org/

所以不要担心。

或者在这里阅读JSON格式 http://james.newtonking.com/projects/json/help/ReducingSerializedJSONSize.html


1
2018-05-24 21:18



但我不能用jQuery解析这个json代码,所以我认为问题出在我从服务器收到的json ...我用jQuery代码更新了第一篇文章。 - Sash