2011-05-24 18 views
9

Estoy trabajando con ASP.NET y jQuery en el lado del cliente.json respuesta contiene n r

Estoy usando Json.NET para serializar datos de la base de datos en el lado del servidor y lo estoy enviando al cliente cuando llega una solicitud Ajax.

Al abrir FireBug, veo el siguiente 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]"} 

Mi código del lado del servidor:

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

Mi código 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"); 
      } 
     }); 

El 'diálogo' variable es un cuadro de diálogo modal jQuery UI y el código $ .ajax está en el controlador de eventos 'abierto' del diálogo ...

¿Qué debo hacer para que el resultado de serialización en un formato json "correcto" sin ningún '\ n', '\ r' y '\'?

¡Gracias de antemano!

Respuesta

8

No debe manualmente serializar JSON esa lista.

ASP.NET ya lo hace por usted automáticamente cuando lo llama a través de POST y utiliza un tipo de contenido application/json. Entonces, terminas con una respuesta doblemente serializada, y es por eso que has descubierto que debes analizarla por segunda vez después de que jQuery ya la haya analizado una vez.

Si utiliza un tipo de devolución de Lista y devuelve la lista directamente, debe estar en buena forma.

Más información: http://encosia.com/2011/04/13/asp-net-web-services-mistake-manual-json-serialization/

+0

Gracias por su aporte :) ¡Me ha ayudado mucho! – Sash

1

Según la especificación JSON: "El espacio en blanco se puede insertar entre cualquier par de tokens".

http://www.json.org/

Así que no se preocupe por ello.

o leer acerca de JSON formato aquí http://james.newtonking.com/projects/json/help/ReducingSerializedJSONSize.html

+0

pero no puede analizar el código JSON con jQuery, así que pensé que el problema es con el JSON que recibo desde el servidor ... He actualizado el primer post con el código jQuery. – Sash

7

Usted podría intentar return JsonConvert.SerializeObject(list, Formatting.None);

¿Has mirado en esta pregunta relacionada ASP.NET+jQuery, how to deSerialize JSON?. Podría ser algo relacionado con el encabezado Content-Type.

EDITAR: Ver comentarios, no hubo un análisis sintáctico del JSON.

+0

Gracias por el enlace, pero no me ayuda ... – Sash

+0

¿Me falta algo o no tienes que analizar primero un objeto? – ColWhi

+0

¡Por supuesto que tienes razón! Agregué $ .parseJSON y todo funciona ahora ... ¡Muchas gracias! – Sash