Serializar una lista a JSON

Tengo un modelo de objetos que se ve así:

public MyObjectInJson { public long ObjectID {get;set;} public string ObjectInJson {get;set;} } 

La propiedad ObjectInJson es una versión ya serializada de un objeto que contiene listas anidadas. Por el momento, estoy serializando la lista de MyObjectInJson manualmente de esta manera:

 StringBuilder TheListBuilder = new StringBuilder(); TheListBuilder.Append("["); int TheCounter = 0; foreach (MyObjectInJson TheObject in TheList) { TheCounter++; TheListBuilder.Append(TheObject.ObjectInJson); if (TheCounter != TheList.Count()) { TheListBuilder.Append(","); } } TheListBuilder.Append("]"); return TheListBuilder.ToString(); 

Me pregunto si puedo reemplazar este tipo de código peligroso con JavascriptSerializer y obtener los mismos resultados. ¿Cómo haría esto?

Gracias.

 // you need to reference System.Web.Extensions using System.Web.Script.Serialization; var jsonSerialiser = new JavaScriptSerializer(); var json = jsonSerialiser.Serialize(aList); 

Tenga en cuenta:

Los tiempos han cambiado, usaría JSON.Net como mi primera opción JSON Parser. Si es la elección correcta para WebAPI, es la opción correcta para mí.

p.ej

 using Newtonsoft.Json; var json = JsonConvert.SerializeObject(aList); 

Es posible que deba instalar el paquete primero.

 PM> Install-Package Newtonsoft.Json 

Para obtener más detalles, vea y resum la respuesta que es la fuente de esta información .

También puedes usar Json.NET. Simplemente descárguelo en http://james.newtonking.com/pages/json-net.aspx , extraiga el archivo comprimido y agréguelo como referencia.

A continuación, solo serialice la lista (o el objeto que desee) con lo siguiente:

 using Newtonsoft.Json; string json = JsonConvert.SerializeObject(listTop10); 

Actualización: también puede agregarlo a su proyecto a través del Administrador de paquetes NuGet (Herramientas -> Administrador de paquetes NuGet -> Consola de Administrador de paquetes):

 PM> Install-Package Newtonsoft.Json 

Documentación: serialización de colecciones

Hay dos formas comunes de hacerlo con los serializadores JSON incorporados:

  1. JavaScriptSerializer

     var serializer = new JavaScriptSerializer(); return serializer.Serialize(TheList); 
  2. DataContractJsonSerializer

     var serializer = new DataContractJsonSerializer(TheList.GetType()); using (var stream = new MemoryStream()) { serializer.WriteObject(stream, TheList); using (var sr = new StreamReader(stream)) { return sr.ReadToEnd(); } } 

    Tenga en cuenta que esta opción requiere la definición de un contrato de datos para su clase:

     [DataContract] public class MyObjectInJson { [DataMember] public long ObjectID {get;set;} [DataMember] public string ObjectInJson {get;set;} } 

.NET ya admite la serialización Json básica a través del espacio de nombres System.Runtime.Serialization.Json y la clase DataContractJsonSerializer desde la versión 3.5. Como su nombre lo indica, DataContractJsonSerializer tiene en cuenta cualquier anotación de datos que agregue a sus objetos para crear la salida final de Json.

Esto puede ser útil si ya tiene clases de datos anotados que desea serializar a Json en una transmisión, como se describe en Cómo: Serializar y deserializar los datos JSON . Existen limitaciones, pero son lo suficientemente buenas y rápidas si tiene necesidades básicas y no desea agregar aún otra biblioteca a su proyecto.

El siguiente código serializa una lista para el flujo de salida de la consola. Como ve, es un poco más detallado que Json.NET y no es seguro para tipos (es decir, no es genérico)

  var list = new List {"a", "b", "c", "d"}; using(var output = Console.OpenStandardOutput()) { var writer = new DataContractJsonSerializer(typeof (List)); writer.WriteObject(output,list); } 

Por otro lado, Json.NET proporciona un control mucho mejor sobre cómo generar Json. Esto será MUY útil cuando tengas que asignar nombres de nombres compatibles con JavaScript a clases .NET, formatear fechas para json, etc.

Otra opción es ServiceStack.Text , parte de ServicStack … stack, que proporciona un conjunto de serializadores muy rápidos para Json, JSV y CSV.

 public static string JSONSerialize(T obj) { string retVal = String.Empty; using (MemoryStream ms = new MemoryStream()) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); serializer.WriteObject(ms, obj); var byteArray = ms.ToArray(); retVal = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length); } return retVal; }