2012-02-02 26 views
115

tengo un modelo de objetos que tiene este aspecto:una lista de números de serie a JSON

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

La propiedad ObjectInJson es una versión ya serializado un objeto que contiene listas anidadas. Por el momento, estoy serializar la lista de MyObjectInJson manualmente así:

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.

Respuesta

220
// you need to reference System.Web.Extensions 

using System.Web.Script.Serialization; 

var jsonSerialiser = new JavaScriptSerializer(); 
var json = jsonSerialiser.Serialize(aList); 

Por favor Nota:

Los tiempos han cambiado, me utilizará por defecto JSON.Net como mi primera opción Analizador JSON. 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 tenga que instalar el paquete primero.

PM> Install-Package Newtonsoft.Json 

Para más detalles see and upvote the answer that is the source of this information.

+1

ah ok, TAMBIÉN serializa listas de objetos y no solo objetos. Gracias. – frenchie

+0

no le gustan las relaciones cíclicas, pero eso no es un problema aquí – Jodrell

+12

Tenga en cuenta que este espacio de nombres está astutamente escondido en System.Web.Extensions. ¡Una vez que lo agrega como referencia, la solución funciona de manera brillante! –

9

Hay dos formas comunes de hacerlo con una función de JSON serializadores:

  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 una 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;} 
    } 
    
3

.NET ya es compatible con la serialización JSON básica a través de la System.Runtime.Serialization.Json namespace 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 Json en una secuencia, como se describe en How To: Serialize and Deserialize JSON Data. 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 puede ver, es un bit más detallado que Json.NET y no de tipo seguro (es decir, no hay genéricos)

 var list = new List<string> {"a", "b", "c", "d"}; 

     using(var output = Console.OpenStandardOutput())     
     {     
      var writer = new DataContractJsonSerializer(typeof (List<string>)); 
      writer.WriteObject(output,list); 
     } 

Por otro lado, Json.NET proporciona mucho mejor control sobre cómo se genera JSON. Esto será muy útil cuando se tiene que asignar Javascript de usar nombres de nombres de .NET clases, formato de fecha a JSON, etc.

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

81

También puede 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, sólo serializar la lista (o cualquier objeto que desee) con lo siguiente:

using Newtonsoft.Json; 

string json = JsonConvert.SerializeObject(listTop10); 

Actualización: también se puede añadir a su proyecto a través del Administrador de paquetes NuGet (Herramientas -> Gestor de paquetes NuGet -> Consola de administrador de paquetes):

PM> Install-Package Newtonsoft.Json 

Documentación: Serializing Collections

+6

o use nuget http://www.nuget.org/packages/newtonsoft.json/ – Jodrell

2
public static string JSONSerialize<T>(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; 
     } 
Cuestiones relacionadas