2012-02-02 15 views
115

Mam model obiektowy, który wygląda tak:Szeregowania listę aby JSON

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

Obiekt ObjectInJson jest już odcinkach wersja obiektem, który zawiera zagnieżdżonych list. W tej chwili mam szeregowania listę MyObjectInJson ręcznie tak:

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

Zastanawiam się, czy mogę zastąpić ten rodzaj kodu niebezpieczna JavascriptSerializer i uzyskać takie same wyniki. Jak to zrobić?

Dzięki.

Odpowiedz

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

using System.Web.Script.Serialization; 

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

Uwaga:

Czasy się zmieniły, chciałbym domyślnie używając Json.NET jako mojego pierwszego wyboru parsera JSON. Jeśli jest to właściwy wybór dla WebAPI, jest to dla mnie właściwy wybór.

np.

using Newtonsoft.Json; 

var json = JsonConvert.SerializeObject(aList); 

Najpierw możesz potrzebować zainstalować pakiet.

PM> Install-Package Newtonsoft.Json 

Aby uzyskać więcej informacji see and upvote the answer that is the source of this information.

+1

ah ok, to również serializuje listy obiektów, a nie tylko same obiekty. Dzięki. – frenchie

+0

Nie lubię cyklicznych relacji, ale to nie jest problem tutaj – Jodrell

+12

Należy zauważyć, że ta przestrzeń nazw jest sprytnie ukryta w System.Web.Extensions. Po dodaniu tego jako odniesienia, rozwiązanie działa doskonale! –

9

Istnieją dwa sposoby robienia że z wbudowanym JSON serializers:

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

    nocie, że opcja ta wymaga definicji umowy o dane dla Twojej klasy:

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

NET już obsługuje podstawowe serializacji JSON przez System.Runtime.Serialization.Json namespace i klasy DataContractJsonSerializer od wersji 3.5. Jak sama nazwa wskazuje, DataContractJsonSerializer uwzględnia wszelkie adnotacje danych, które dodajesz do swoich obiektów, aby utworzyć ostateczne wyjście Json.

To może być przydatne, jeśli posiadasz już przypisane klasy danych, które chcesz przekształcić Json do strumienia, jak opisano w How To: Serialize and Deserialize JSON Data. Istnieją ograniczenia, ale jest wystarczająco dobre i wystarczająco szybkie, jeśli masz podstawowe potrzeby i nie chcesz dodawać jeszcze innej biblioteki do swojego projektu.

Następujący kod serializuje listę do strumienia wyjściowego konsoli. Jak widzisz, jest to bardziej szczegółowe niż Json.Netto, a nie typu-safe (tj żadnych rodzajowych)

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

Z drugiej strony, Json.NET zapewnia znacznie lepszą kontrolę nad tym, jak można wygenerować JSON. To będzie bardzo przydatne, gdy będziesz musiał mapować nazwy przyjazne dla javascript na klasy .NET, formatować daty na json itp.

Inna opcja to ServiceStack.Text, część zestawu ServicStack ..., która zapewnia zestaw bardzo szybkie serializery dla Json, JSV i CSV.

81

Możesz także użyć Json.NET. Wystarczy pobrać go pod http://james.newtonking.com/pages/json-net.aspx, wyodrębnić skompresowany plik i dodać go jako odniesienie.

Wtedy właśnie serializacji listy (lub cokolwiek przedmiotem chcesz) z następującym:

using Newtonsoft.Json; 

string json = JsonConvert.SerializeObject(listTop10); 

Aktualizacja: można również dodać do projektu poprzez Nuget Package Manager (Narzędzia -> Nuget Package Manager -> Package Manager Console):

PM> Install-Package Newtonsoft.Json 

Dokumentacja: Serializing Collections

+6

lub użyj 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; 
     } 
Powiązane problemy