2012-02-02 17 views
115

ho un modello a oggetti che assomiglia a questo:Serializzazione un elenco per JSON

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

La proprietà ObjectInJson è una versione già serializzata un oggetto che contiene gli elenchi nidificati. Per il momento, sto serializzazione l'elenco dei MyObjectInJson manualmente in questo modo:

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(); 

Mi chiedo se posso sostituire questo tipo di codice pericoloso con JavascriptSerializer e ottenere gli stessi risultati. Come farei questo?

Grazie.

risposta

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

using System.Web.Script.Serialization; 

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

Attenzione: per

I tempi sono cambiati, vorrei default utilizzando JSON.Net come la mia prima scelta JSON parser. Se è la scelta giusta per WebAPI, è la scelta giusta per me.

ad es.

using Newtonsoft.Json; 

var json = JsonConvert.SerializeObject(aList); 

potrebbe essere necessario installare prima il pacchetto.

PM> Install-Package Newtonsoft.Json 

Per ulteriori dettagli see and upvote the answer that is the source of this information.

+1

ah ok, anche serializza elenchi di oggetti e non solo oggetti stessi. Grazie. – frenchie

+0

non è come le relazioni cicliche ma non è un problema qui – Jodrell

+12

Si noti che questo spazio dei nomi è abilmente nascosto in System.Web.Extensions. Una volta aggiunto questo come riferimento, la soluzione funziona brillantemente! –

9

Ci sono due modi comuni di farlo con built-in JSON serializzatori:

  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(); 
        } 
    } 
    

    nota, che questa opzione richiede definizione di un contratto di dati per la tua classe:

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

.NET supporta già la serializzazione di base JSON attraverso il System.Runtime.Serialization.Json namespace e la classe DataContractJsonSerializer a partire dalla versione 3.5. Come suggerisce il nome, DataContractJsonSerializer prende in considerazione tutte le annotazioni di dati che aggiungi ai tuoi oggetti per creare l'output finale di Json.

Questo può essere utile se si dispone già di classi di dati annotate che si desidera serializzare Json in un flusso, come descritto in How To: Serialize and Deserialize JSON Data. Ci sono dei limiti ma è abbastanza buono e abbastanza veloce se hai esigenze di base e non vuoi aggiungere ancora un'altra libreria al tuo progetto.

Il seguente codice serializza un elenco al flusso di output della console. Come vedi è un bit più prolisso di Json.NET e non type-safe (cioè non generici)

 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); 
     } 

D'altra parte, Json.NET fornisce molto migliore controllo su come si genera JSON. Questo verrà molto utile quando si deve mappare javascript-friendly nomi nomi NET classi, formato risale a JSON ecc

Un'altra opzione è ServiceStack.Text, parte del ServicStack ... stack, che fornisce una serie di serializzatori molto veloci per Json, JSV e CSV.

81

È anche possibile utilizzare Json.NET. Basta scaricarlo allo http://james.newtonking.com/pages/json-net.aspx, estrarre il file compresso e aggiungerlo come riferimento.

Poi basta serializzare l'elenco (o qualsiasi oggetto che si desidera) con la seguente:

using Newtonsoft.Json; 

string json = JsonConvert.SerializeObject(listTop10); 

Update: è anche possibile aggiungere al tuo progetto tramite il NuGet Package Manager (Strumenti -> NuGet Package Manager -> Package manager Console):

PM> Install-Package Newtonsoft.Json 

Documentazione: Serializing Collections

+6

o usa 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; 
     } 
Problemi correlati