web-dev-qa-db-fra.com

Désérialiser JSON en objet anonyme

En C #, j'ai réussi à sérialiser un objet anonyme en JSON en utilisant du code comme celui-ci ...

var obj = new { Amount = 108, Message = "Hello" };
JavaScriptSerializer serializer = new JavaScriptSerializer();
String output = serializer.Serialize(obj);

Cependant, ce que j'aimerais pouvoir faire plus tard, c'est désérialiser la chaîne JSON en un objet anonyme. Quelque chose comme ça...

var obj2 = serializer.Deserialize(output, object);

Mais la méthode serializer.Deserialize () nécessite un deuxième paramètre qui est le type d'objet vers lequel il sera désérialisé.

J'ai essayé ça ...

var obj2 = serializer.Deserialize(output, obj.GetType());

Mais cela produit une erreur:

Aucun constructeur sans paramètre défini pour le type '<> f__AnonymousType0`2 [[System.Int32, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089], [System.String, mscorlib, Version = 4.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089]] '.

Je ne sais pas ce que signifie cette erreur.

40
jdavis

JSON.Net est une bibliothèque puissante pour travailler avec JSON dans .Net

Il existe une méthode DeserializeAnonymousType à laquelle vous pouvez accéder.

Mettre à jour: Json.Net est maintenant inclus avec ASP.Net, cependant mon dernier favori que j'utilise est - JsonFX . Il a également un excellent support linq, vérifiez-le.

Update 2: Je suis passé de JsonFX et j'utilise actuellement ServiceStack.Text , c'est rapide!

31
Vin

que diriez-vous de la dynamique, la façon la plus rapide que je vois est la suivante:

dynamic myObject = JsonConvert.DeserializeObject<dynamic>(output);

decimal Amount = Convert.ToDecimal(myObject.Amount);
string Message = myObject.Message;

Remarque: vous aurez besoin de la référence Newtonsoft.json.dll

23
i31nGo

Que diriez-vous d'utiliser la méthode DeserializeObject , il ne nécessite pas de type spécifique. Cela a également résolu ne question similaire SO . La méthode se désérialise en Dictionary<string, object> contenant des paires nom/valeur.

Mise à jour : pour clarifier l'erreur que vous obtenez en faisant ceci:

var obj2 = serializer.Deserialize(output, obj.GetType());

Étant donné le type de obj, Deserialize essaiera de créer une nouvelle instance du type à l'aide d'un constructeur par défaut. Les types anonymes en C # n'ont pas de constructeur public sans paramètre, et donc l'opération échoue.

14
Peter Lillevold

Cela peut également être fait à l'aide du JavaScriptSerializer intégré, comme suit:

object result = new JavaScriptSerializer().DeserializeObject(JSONData);

Cela retournera une instance d'objet [], avec des paires valeur-clé.

5
XtraSimplicity

Récemment, j'ai utilisé le génial bibliothèque JsonFx.Net et j'ai fini par apprécier ce qu'il fait. Vous pouvez utiliser Nuget Package Manager pour l'installer directement dans Visual Studio.

Le code va comme ça,

var reader = new JsonReader();
string input = @"{ ""first"": ""Foo"", ""last"": ""Bar"" }";
var template = new { first=String.Empty, middle=String.Empty, last=String.Empty };
var output = reader.Read(input, template);

Comme vous pouvez le voir, vous pouvez même spécifier le modèle de type anonyme.

1
Vin