serialize - recorrer json c#
Serializar una lista a JSON (5)
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.
.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 secuencia, como se describe en Cómo: Serializar y deserializar 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<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 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.
Hay dos formas comunes de hacerlo con los serializadores JSON incorporados:
-
var serializer = new JavaScriptSerializer(); return serializer.Serialize(TheList);
-
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;} }
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
// 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 resuma la respuesta que es la fuente de esta información .
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;
}