244 votes

Sérialiser une liste en JSON

J'ai un modèle d'objet qui ressemble à ceci:

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

La propriété ObjectInJson est une version déjà sérialisée d'un objet contenant des listes imbriquées. Pour le moment, je sérialise manuellement la liste de MyObjectInJson comme ceci:

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

Je me demande si je peux remplacer ce type de code dangereux par JavascriptSerializer et obtenir les mêmes résultats. Comment je ferais ça?

Merci.

453voto

Jodrell Points 14205
// you need to reference System.Web.Extensions

using System.Web.Script.Serialization;
var jsonSerialiser = new JavaScriptSerializer();
var json = jsonSerialiser.Serialize(aList);

124voto

Brent Barbata Points 671

Vous pouvez également utiliser Json.NET. Il suffit de le télécharger à http://james.newtonking.com/pages/json-net.aspx, extrait le fichier compressé et l'ajouter comme une référence.

Puis il suffit de sérialiser la liste (ou n'importe quel objet que vous voulez) avec les éléments suivants:

using Newtonsoft.Json;

string json = JsonConvert.SerializeObject(listTop10);

Mise à jour: vous pouvez également l'ajouter à votre projet via le Gestionnaire de Package NuGet (Outils --> Gestionnaire de Package NuGet --> Gestionnaire de paquets de la Console):

PM> Install-Package Newtonsoft.Json

13voto

Joulukuusi Points 1897

Il existe deux manières courantes de le faire avec les sérialiseurs JSON intégrés:

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

    Notez que cette option nécessite la définition d'un contrat de données pour votre classe:

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

5voto

Panagiotis Kanavos Points 14085

.NET prend déjà en charge de base de la sérialisation Json à travers le Système.Moment de l'exécution.La sérialisation.Json espace de noms et le DataContractJsonSerializer classe depuis la version 3.5. Comme son nom l'indique, DataContractJsonSerializer prend en compte toutes les annotations de données que vous ajoutez à vos objets pour créer la dernière sortie Json.

Qui peut être pratique si vous avez déjà annoté classes de données que vous souhaitez sérialiser Json à un flux de données, comme décrit dans la procédure: Sérialiser et Désérialiser des Données JSON. Il y a des limites mais il est assez bon et assez rapide si vous avez besoins de base et vous ne voulez pas ajouter Encore une Autre Bibliothèque à votre projet.

Le code suivant serializea une liste à la sortie de la console de flux. Comme vous le voyez c'est un peu plus bavarde que Json.NET et pas de type-safe (c'est à dire pas de génériques)

        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'autre part, Json.NET fournit un bien meilleur contrôle sur la façon dont vous générer du Json. Ce sera TRÈS utile lorsque vous avez à la carte javascript-friendly noms de noms de .NET classes, le format des dates à json etc.

Une autre option est ServiceStack.Le texte, une partie de la ServicStack ... pile, qui fournit un ensemble de très rapide sérialiseurs de Json, JSV et CSV.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X