2011-05-24 77 views
9

我在客戶端使用ASP.NET和jQuery。json響應包含 n r

我使用Json.NET序列化來自服務器端數據庫的數據,並在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"); 
      } 
     }); 

的 '對話'變量是一個jQuery UI模式對話框,並且$ .ajax代碼位於對話框的「打開」事件處理程序中...

我應該怎樣做才能使序列化結果成爲「正確的」json格式,而沒有任何'\ n','\ r'和'\'?

提前致謝!

回答

8

您不應該手動JSON序列化該列表。

當您通過POST調用它並使用application/json的內容類型時,ASP.NET將自動爲您執行此操作。所以,你最終得到了一個雙序列化的響應,這就是爲什麼你發現你需要在jQuery已經解析了一次之後再次解析它。

如果您使用返回類型的列表並直接返回列表,您應該狀態良好。

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

+0

感謝您的輸入:)你已經幫了我很多! – Sash 2011-05-25 06:51:54

7

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

你有沒有看此相關的問題ASP.NET+jQuery, how to deSerialize JSON?。可能與Content-Type標題有關。

編輯:看到評論,沒有解析的JSON。

+0

感謝您的鏈接,但它並沒有幫助我... – Sash 2011-05-24 21:58:29

+0

我錯過了什麼,或者你不得不首先解析對象? – ColWhi 2011-05-24 22:06:50

+0

當然你是對的! 我增加了$ .parseJSON,現在一切正常... 非常感謝! – Sash 2011-05-24 22:14:45