171 votes

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

Je suis d'essayer d'utiliser le code suivant pour sérialiser un anonyme de type JSON:

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

Cependant, je reçois l'exception suivante lorsque cela est exécutée:

Type '<>f__AnonymousType1`3[Système.Int32,Système.Int32,Système.Object[]]' ne peut pas être sérialisé. Envisager de marquer avec le DataContractAttribute l'attribut, et le marquage de l'ensemble de ses les membres que vous souhaitez sérialisé avec la DataMemberAttribute attribut. Voir la Microsoft .NET Framework la documentation pour les autres les types.

Je ne peux pas appliquer les attributs d'un type anonyme (autant que je sache). Est-il une autre façon de faire de la sérialisation ou ai-je raté quelque chose?

161voto

Nick Berardi Points 31361

Essayez JavaScriptSerializer au lieu de DataContractJsonSerializer

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

84voto

Matthew Nichols Points 1327

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.

16voto

mythz Points 54874

Vous pouvez essayer de mon ServiceStack JsonSerializer c'est le plus rapide .NET sérialiseur JSON pour le moment. Il prend en charge la sérialisation DataContract, Tout Type POCO, Interfaces, Tardive des objets, 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: utilisez Uniquement les Microsoft JavaScriptSerializer si la performance n'est pas important pour vous que j'ai dû laisser mes repères depuis sa jusqu'à 40x et 100x plus lent que les autres JSON sérialiseurs.

11voto

Jason Jackson Points 11563

Je dirais que vous ne devriez pas être la sérialisation d'un type anonyme. Je sais que la tentation ici; vous voulez rapidement générer de jeter les types qui vont être utilisés dans un large environnement de type aka Javascript dans le navigateur. Encore, je voudrais créer un type réel et de le décorer comme Sérialisable. Ensuite, vous pouvez fortement du type de votre site web méthodes. Tout cela n'importe pas d'un iota pour le Javascript, il ne ajouter un peu d'auto-documentation de la méthode. Tout raisonnablement programmeur expérimenté sera en mesure de regarder la signature de la fonction et de dire, "Oh, c'est le type de Foo! Je sais comment cela devrait se regarder dans JSON."

Cela dit, vous pouvez essayer de JSON.Net pour faire de la sérialisation. Je n'ai aucune idée si cela ne fonctionne pas

8voto

CMS Points 315406

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