¿Cómo serializo un tipo anónimo C # en una cadena JSON?

Estoy intentando usar el siguiente código para serializar un tipo anónimo a JSON:

var serializer = new DataContractJsonSerializer(thing.GetType()); var ms = new MemoryStream(); serializer.WriteObject(ms, thing); var json = Encoding.Default.GetString(ms.ToArray()); 

Sin embargo, recibo la siguiente excepción cuando se ejecuta esto:

Escriba ‘ f__AnonymousType1`3 [System.Int32, System.Int32, System.Object []]’ no se puede serializar. Considere marcarlo con el atributo DataContractAttribute y marcar todos sus miembros que desee serializar con el atributo DataMemberAttribute. Consulte la documentación de Microsoft .NET Framework para otros tipos compatibles.

No puedo aplicar atributos a un tipo anónimo (hasta donde yo sé). ¿Hay otra forma de hacer esta serialización o me falta algo?

Pruebe el JavaScriptSerializer en lugar del DataContractJsonSerializer

 JavaScriptSerializer serializer = new JavaScriptSerializer(); var output = serializer.Serialize(your_anon_object); 

Como han mencionado otros, Newtonsoft JSON.NET es una buena opción. Aquí hay un ejemplo específico para la serialización JSON simple:

 return JsonConvert.SerializeObject( new { DataElement1, SomethingElse }); 

He descubierto que es una biblioteca muy flexible y versátil.

Puedes probar mi ServiceStack JsonSerializer , es el serializador .NET JSON más rápido en este momento. Admite la serialización de DataContract, Cualquier tipo de POCO, Interfaces, Objetos de límite tardío, incluidos los tipos anónimos, etc.

Ejemplo Básico

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

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.

Yo diría que no debería serializar un tipo anónimo . Conozco la tentación aquí; Desea generar rápidamente algunos tipos desechables que simplemente se utilizarán en un entorno de tipo libre, como Javascript en el navegador. Aún así, crearía un tipo real y lo decoraría como Serializable. Entonces puede escribir fuertemente sus métodos web. Si bien esto no importa un ápice de Javascript, sí agrega algo de auto-documentación al método. Cualquier progtwigdor con experiencia razonable podrá ver la firma de la función y decir: “¡Oh, esto es tipo Foo! Sé cómo debería verse en JSON”.

Una vez dicho esto, puede intentar JSON.Net para hacer la serialización. No tengo idea si funcionará

La forma más rápida que encontré fue esta:

 var obj = new {Id = thing.Id, Name = thing.Name, Age = 30}; JavaScriptSerializer serializer = new JavaScriptSerializer(); string json = serializer.Serialize(obj); 

Espacio de nombres: System.Web.Script.Serialization.JavaScriptSerializer

Suponiendo que está utilizando esto para un servicio web, puede simplemente aplicar el siguiente atributo a la clase:

 [System.Web.Script.Services.ScriptService] 

A continuación, el siguiente atributo para cada método que debe devolver Json:

 [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 

Y establezca el tipo de retorno para que los métodos sean “objeto”

 public static class JsonSerializer { public static string Serialize(this T data) { try { DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); var stream = new MemoryStream(); serializer.WriteObject(stream, data); string jsonData = Encoding.UTF8.GetString(stream.ToArray(), 0, (int)stream.Length); stream.Close(); return jsonData; } catch { return ""; } } public static T Deserialize(this string jsonData) { try { DataContractJsonSerializer slzr = new DataContractJsonSerializer(typeof(T)); var stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonData)); T data = (T)slzr.ReadObject(stream); stream.Close(); return data; } catch { return default(T); } } }