Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

json response contains \n \r

I'm working with ASP.NET and jQuery on client side.

I'm using Json.NET to serialize data from the DB on the server side and I'm sending it to the client when an Ajax request arrives.

When I open FireBug, I see the following 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]"}

My code from server side:

    [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);
}

My jQuery code:

$.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");
            }
        });

The 'dialog' variable is a jQuery UI modal dialog and the $.ajax code is in the dialog's 'open' event handler...

What should I do to make the serialization result in a "correct" json format without any '\n', '\r' and '\' ?

Thanks in advance!

like image 721
Sash Avatar asked May 24 '11 21:05

Sash


3 Answers

You should not manually JSON serialize that List.

ASP.NET is already doing it for you automatically when you call it via POST and use a content-type of application/json. So, you're ending up with a doubly serialized response, and that is why you've found that you need to parse it a second time after jQuery has already parsed it once.

If you use a return type of List and return the list directly, you should be in good shape.

More info: http://encosia.com/2011/04/13/asp-net-web-services-mistake-manual-json-serialization/

like image 82
Dave Ward Avatar answered Oct 19 '22 16:10

Dave Ward


You could try return JsonConvert.SerializeObject(list, Formatting.None);

Have you looked at this related question ASP.NET+jQuery, how to deSerialize JSON?. Might be something to do with the Content-Type header.

EDIT: See comments, there was no parsing of the JSON.

like image 28
ColWhi Avatar answered Oct 19 '22 15:10

ColWhi


According to the JSON spec: "Whitespace can be inserted between any pair of tokens."

http://www.json.org/

So don't worry about it.

Or read about JSON formatting here http://james.newtonking.com/projects/json/help/ReducingSerializedJSONSize.html

like image 25
Mark Bolusmjak Avatar answered Oct 19 '22 17:10

Mark Bolusmjak