Cómo crear una cadena JSON en C #

Acabo de utilizar el XmlWriter para crear algo de XML para enviar de vuelta en una respuesta HTTP. ¿Cómo crearías una cadena JSON? Supongo que usaría un generador de cadenas para construir la cadena JSON y les daría formato a su respuesta como JSON.

Puede usar la clase JavaScriptSerializer , consulte este artículo para crear un método de extensión útil.

Código del artículo:

namespace ExtensionMethods { public static class JSONHelper { public static string ToJSON(this object obj) { JavaScriptSerializer serializer = new JavaScriptSerializer(); return serializer.Serialize(obj); } public static string ToJSON(this object obj, int recursionDepth) { JavaScriptSerializer serializer = new JavaScriptSerializer(); serializer.RecursionLimit = recursionDepth; return serializer.Serialize(obj); } } } 

Uso:

 using ExtensionMethods; ... List people = new List{ new Person{ID = 1, FirstName = "Scott", LastName = "Gurthie"}, new Person{ID = 2, FirstName = "Bill", LastName = "Gates"} }; string jsonString = people.ToJSON(); 

Usar Newtonsoft.Json lo hace realmente más fácil:

 Product product = new Product(); product.Name = "Apple"; product.Expiry = new DateTime(2008, 12, 28); product.Price = 3.99M; product.Sizes = new string[] { "Small", "Medium", "Large" }; string json = JsonConvert.SerializeObject(product); 

Documentación: Serialización y deserialización de JSON

Esta biblioteca es muy buena para JSON desde C #

http://james.newtonking.com/pages/json-net.aspx

Este fragmento de código usa DataContractJsonSerializer de System.Runtime.Serialization.Json en .NET 3.5.

 public static string ToJson(/* this */ T value, Encoding encoding) { var serializer = new DataContractJsonSerializer(typeof(T)); using (var stream = new MemoryStream()) { using (var writer = JsonReaderWriterFactory.CreateJsonWriter(stream, encoding)) { serializer.WriteObject(writer, value); } return encoding.GetString(stream.ToArray()); } } 

Eche un vistazo a http://www.codeplex.com/json/ para el proyecto json-net.aspx. ¿Por qué reinventar la rueda?

También puede probar mi ServiceStack JsonSerializer , es el serializador .NET JSON más rápido en este momento. Admite la serialización de DataContracts, cualquier tipo de POCO, interfaces, objetos de último momento, incluidos los tipos anónimos, etc.

Ejemplo Básico

 var customer = new Customer { Name="Joe Bloggs", Age=31 }; var json = JsonSerializer.SerializeToString(customer); var fromJson = JsonSerializer.DeserializeFromString(json); 

Nota: solo use el JavaScriptSerializer de Microsofts si el rendimiento no es importante para usted, ya que tuve que dejarlo fuera de mis puntos de referencia ya que es hasta 40x-100x más lento que los otros serializadores JSON.

Si necesita resultado complejo (incrustado) cree su propia estructura:

 class templateRequest { public String[] registration_ids; public Data data; public class Data { public String message; public String tickerText; public String contentTitle; public Data(String message, String tickerText, string contentTitle) { this.message = message; this.tickerText = tickerText; this.contentTitle = contentTitle; } }; } 

y luego puedes obtener una cadena JSON con llamadas

 List ids = new List() { "id1", "id2" }; templateRequest request = new templeteRequest(); request.registration_ids = ids.ToArray(); request.data = new templateRequest.Data("Your message", "Your ticker", "Your content"); string json = new JavaScriptSerializer().Serialize(request); 

El resultado será así:

 json = "{\"registration_ids\":[\"id1\",\"id2\"],\"data\":{\"message\":\"Your message\",\"tickerText\":\"Your ticket\",\"contentTitle\":\"Your content\"}}" 

¡Espero eso ayude!

Si no puede o no quiere utilizar los dos serializadores JSON incorporados ( JavaScriptSerializer y DataContractJsonSerializer ), puede probar la biblioteca JsonExSerializer ; la utilizo en una serie de proyectos y funciona bastante bien.

Si está intentando crear un servicio web para enviar datos a través de JSON a una página web, considere utilizar el kit de herramientas ASP.NET Ajax:

http://www.asp.net/learn/ajax/tutorial-05-cs.aspx

Automáticamente convertirá sus objetos servidos sobre un servicio web a json, y creará la clase de proxy que puede usar para conectarse.

El DataContractJSONSerializer hará todo por usted con la misma facilidad que XMLSerializer. Es trivial usar esto en una aplicación web. Si está utilizando WCF, puede especificar su uso con un atributo. La familia DataContractSerializer también es muy rápida.

Descubrí que no necesita el serializador en absoluto. Si devuelve el objeto como una lista. Dejame usar un ejemplo.

En nuestro asmx obtenemos los datos usando la variable que pasamos

 // return data [WebMethod(CacheDuration = 180)] public List GetData(int id) { var data = from p in db.property where p.id == id select new latlon { lat = p.lat, lon = p.lon }; return data.ToList(); } public class latlon { public string lat { get; set; } public string lon { get; set; } } 

Luego, usando jquery, accedemos al servicio, pasando esa variable.

 // get latlon function getlatlon(propertyid) { var mydata; $.ajax({ url: "getData.asmx/GetLatLon", type: "POST", data: "{'id': '" + propertyid + "'}", async: false, contentType: "application/json;", dataType: "json", success: function (data, textStatus, jqXHR) { // mydata = data; }, error: function (xmlHttpRequest, textStatus, errorThrown) { console.log(xmlHttpRequest.responseText); console.log(textStatus); console.log(errorThrown); } }); return mydata; } // call the function with your data latlondata = getlatlon(id); 

Y obtenemos nuestra respuesta.

 {"d":[{"__type":"MapData+latlon","lat":"40.7031420","lon":"-80.6047970}]} 

Codificar el uso

Objeto simple para JSON Array EncodeJsObjectArray ()

 public class dummyObject { public string fake { get; set; } public int id { get; set; } public dummyObject() { fake = "dummy"; id = 5; } public override string ToString() { StringBuilder sb = new StringBuilder(); sb.Append('['); sb.Append(id); sb.Append(','); sb.Append(JSONEncoders.EncodeJsString(fake)); sb.Append(']'); return sb.ToString(); } } dummyObject[] dummys = new dummyObject[2]; dummys[0] = new dummyObject(); dummys[1] = new dummyObject(); dummys[0].fake = "mike"; dummys[0].id = 29; string result = JSONEncoders.EncodeJsObjectArray(dummys); 

Resultado: [[29, “mike”], [5, “dummy”]]

Bonito uso

Pretty print JSON Array PrettyPrintJson () método de extensión de cadena

 string input = "[14,4,[14,\"data\"],[[5,\"10.186.122.15\"],[6,\"10.186.122.16\"]]]"; string result = input.PrettyPrintJson(); 

Resultados es:

 [ 14, 4, [ 14, "data" ], [ [ 5, "10.186.122.15" ], [ 6, "10.186.122.16" ] ] ]