2012-05-10 64 views
5

Soy nuevo en JSON, y quiero hacer un objeto JSON simple usando StringBuilder que sería consultado por una llamada jQuery Ajax.Cómo crear un objeto JSON simple usando C# string Builder

[WebMethod] 
public static string GetmyJSON() 
{ 
    StringBuilder sb = new StringBuilder();  
    sb.Append("{firstname: \"Manas\",").Append("lastname : \"Tunga\"").Append("}"); 
    return sb.ToString();  

} 

En mi código de cliente que tengo:

.ajax({ 

     type: "POST", 
     url: "simplePage.aspx/GetmyJSON",   
     data: "{}", 
     contentType: 'application/json; charset=utf-8', 
     dataType: 'json', 

     success: function (data) { 

      alert(data.d.firstname);    


     } // end of sucess 

    }); // End of ajax 

Pero mi mensaje de alerta aparece 'indefinido' en lugar de 'Manas'. ¿Es posible devolver un objeto JSON utilizando StringBuilder?

+0

Puede construir el objeto .NET apropiado que encapsula los datos que desea enviar de vuelta y filtrarlos a JSON a través de una biblioteca como JSON.Net.Si desea alguna técnica incorporada, investigue un poco con DataContractSerializer – deostroll

+0

Si insiste en hacerlo de esta manera, cambie el '\" 'a' '', éter cámbielo a '\\\" ' – Aristos

+1

Nombre de propiedad JSON debe citarse, es decir: '{" id ": 10}' – canon

Respuesta

3
var lstMes = new List<Person>(); 

      System.Web.Script.Serialization.JavaScriptSerializer oSerializer = 
      new System.Web.Script.Serialization.JavaScriptSerializer(); 
       string sJSON = oSerializer.Serialize(lstMes); 
       return sJSON; 

No se olvide de añadir una referencia a:

System.Web.Extensions.dll !! 
10

Nunca hacer eso. Nunca compilación JSON manualmente. Siempre use los serializadores JSON. O en su caso, ni siquiera necesita hacer eso porque el tiempo de ejecución de ASP.NET webmethod se encargará. Todo lo que tiene que hacer es enfocarse en los requisitos de su negocio y no preocuparse por la plomería.

Así, por ejemplo, empezar por definir un modelo que representará sus datos:

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

y luego tener su método Web devolver este modelo de dejar todas las preocupaciones de serialización del marco:

[WebMethod] 
public static Person GetPerson() 
{ 
    Person p = new Person(); 
    p.FirstName = "Manas"; 
    p.LastName = "Tunga"; 
    return p; 
} 

Y ahora simplemente consuma este método del cliente:

$.ajax({ 
    type: 'POST', 
    url: 'simplePage.aspx/GetPerson', 
    data: '{ }', 
    contentType: 'application/json; charset=utf-8', 
    success: function (data) { 
     alert(data.d.FirstName); 
     alert(data.d.LastName); 
    } 
}); 

No nee d preocuparse de JSON, los constructores de cadena, ...

Y también se podría pasar argumentos complejos a su método Web si necesita:

public class Foo 
{ 
    public string Bar { get; set; } 
} 

y luego:

[WebMethod] 
public static Person GetPerson(Foo foo) 
{ 
    ... 
} 

y por último:

$.ajax({ 
    type: 'POST', 
    url: 'simplePage.aspx/GetPerson', 
    data: JSON.stringify({ foo: { bar: 'baz' } }), 
    contentType: 'application/json; charset=utf-8', 
    success: function (data) { 
     alert(data.d.FirstName); 
     alert(data.d.LastName); 
    } 
}); 

El método JSON.stringify se muestra aquí está construido de forma nativa en el navegador moderno s. Si necesita admitir navegadores antiguos, puede incluir el script json2.js en su página.

+0

Si le insisto en usar el generador de cadenas para crear JSON manualmente, ¿cómo lo haría? Me gustaría saber dónde fue mi error – manas

+0

No puede insistir en algo tan malo como crear JSON manualmente usando cadenas. Lo que está mal es el enfoque que has tomado. Lo que pasa es que estás devolviendo una cadena desde tu método web. Por lo tanto, dentro de su controlador de éxito necesita analizar esta cadena de regreso a un objeto si desea acceder a él, como esta 'alerta ($. ParseJSON (data.d) .firstname);'. Pero por favor, por favor, prométeme que nunca harás algo así. –

+0

@DarinDimitrov, usted es lo suficientemente autoritario como para creerle y descartar mis preocupaciones sobre el rendimiento, pero todavía tengo curiosidad de por qué es malo y por qué no hay una clase JsonBuilder nativa en BCL en analogía a StringBuilder, XmlWriter, HtmlTextWriter. ¿Por qué todos están bien, pero JsonBuilder es malo? Digamos que necesito crear objetos simples de 5 propiedades, pero algunas propiedades deben definirse solo cuando se cumplen algunas condiciones. Es demasiado complejo definir la jerarquía de modelos para ese caso; utilizaré entonces la dinámica o el diccionario. Hará daño al rendimiento un poco ... –

0

Respondiendo estrictamente a la pregunta: sí, puede devolver lo que quiera de un método .NET. Su problema, como @canon dijo en un comentario sobre la pregunta, es probable que deba envolver los nombres de las propiedades.

que demuestra por qué la respuesta "correcta" (como ya se ha mencionado: 1, 2) es utilizar un serializador existente como JSON.NET (si es necesario serializar manualmente) o dejar que lo manejan .NET (como lo hace en la mayoría " "iteraciones" recientes al devolver el objeto en sí.

Cuestiones relacionadas