web-dev-qa-db-fra.com

Comment sérialiser un type anonyme C # en une chaîne JSON?

J'essaie d'utiliser le code suivant pour sérialiser un type anonyme en JSON:

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

Cependant, j'obtiens l'exception suivante lorsque cela est exécuté:

Le type '<> f__AnonymousType1`3 [System.Int32, System.Int32, System.Object []]' ne peut pas être sérialisé. Pensez à le marquer avec l'attribut DataContractAttribute et à tous les membres à sérialiser avec l'attribut DataMemberAttribute. Consultez la documentation Microsoft .NET Framework pour connaître les autres types pris en charge.

Je ne peux pas appliquer d'attributs à un type anonyme (pour autant que je sache). Y at-il un autre moyen de faire cette sérialisation ou est-ce que je manque quelque chose?

156
JC Grubbs

Essayez le JavaScriptSerializer au lieu du DataContractJsonSerializer

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

Comme d'autres l'ont mentionné, Newtonsoft JSON.NET est une bonne option. Voici un exemple spécifique pour la sérialisation JSON simple:

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

J'ai trouvé que c'était une bibliothèque très flexible et polyvalente.

69
Matthew Nichols

Vous pouvez essayer mon ServiceStack JsonSerializer c'est le le sérialiseur JSON le plus rapide .NET pour le moment. Il prend en charge la sérialisation de DataContract, tout type de POCO, les interfaces, les objets à liaison tardive, y compris les types anonymes, etc.

Exemple de base

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

Remarque: N'utilisez JavaScriptSerializer de Microsofts que si les performances ne sont pas importantes pour vous, car je dois le laisser en dehors de mes performances depuis 40x-100x . plus lent que les autres sérialiseurs JSON.

13
mythz

Veuillez noter que cela date de 2008. Aujourd'hui, je dirais que le sérialiseur devrait être intégré et que vous pouvez probablement utiliser les attributs swagger + pour informer les consommateurs de votre point de terminaison et renvoyer des données.


Je dirais que vous ne devriez pas sérialiser un type anonyme . Je connais la tentation ici; vous voulez générer rapidement des types à jeter qui vont juste être utilisés dans un environnement de type vague, javascript dans le navigateur. Pourtant, je créerais un type réel et le décorerais comme Serializable. Ensuite, vous pouvez taper fortement vos méthodes Web. Bien que cela ne soit pas important, iota pour Javascript, cela ajoute une auto-documentation à la méthode. Tout programmeur raisonnablement expérimenté sera en mesure d’examiner la signature de la fonction et de dire: "Oh, c’est du type Foo! Je sais comment cela devrait ressembler à JSON."

Cela dit, vous pouvez essayer JSON.Net de procéder à la sérialisation. Je ne sais pas si ça va marcher

11
Jason Jackson

Le moyen le plus rapide que j'ai trouvé était le suivant:

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

Espace de noms: System.Web.Script.Serialization.JavaScriptSerializer

8
i31nGo

En supposant que vous l'utilisiez pour un service Web, vous pouvez simplement appliquer l'attribut suivant à la classe:

[System.Web.Script.Services.ScriptService]

Ensuite, l'attribut suivant à chaque méthode devant renvoyer Json:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

Et définir le type de retour pour les méthodes à "objet"

1
Paul