Domanda

Sto tentando di utilizzare il seguente codice per serializzare un tipo anonimo su JSON:

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

Tuttavia, ottengo la seguente eccezione quando viene eseguita:

  

Tipo   'Lt &; & Gt; f__AnonymousType1`3 [System.Int32, System.Int32, System.Object []]'   non può essere serializzato. Prendi in considerazione la marcatura   con DataContractAttribute   attributo e contrassegnando tutto ciò   membri che si desidera serializzare con   Attributo DataMemberAttribute. Vedere   Microsoft .NET Framework   documentazione per altri supportati   tipi.

Non riesco ad applicare gli attributi a un tipo anonimo (per quanto ne so). C'è un altro modo di fare questa serializzazione o mi sto perdendo qualcosa?

È stato utile?

Soluzione

Prova JavaScriptSerializer invece di DataContractJsonSerializer

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

Altri suggerimenti

Come altri hanno già detto, Newtonsoft JSON.NET è una buona opzione. Ecco un esempio specifico per la semplice serializzazione JSON:

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

Ho trovato una libreria molto flessibile e versatile.

Il modo più veloce che ho trovato è stato questo:

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

Spazio dei nomi: System.Web.Script.Serialization.JavaScriptSerializer

Supponendo che tu lo stia utilizzando per un servizio web, puoi semplicemente applicare il seguente attributo alla classe:

[System.Web.Script.Services.ScriptService]

Quindi il seguente attributo a ciascun metodo che dovrebbe restituire Json:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

E imposta il tipo restituito per i metodi su " oggetto "

public static class JsonSerializer
{
    public static string Serialize<T>(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<T>(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);
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top