2011-11-03 4 views
13

Juste essayer de créer un type anonyme à partir de JSON sans rien savoir sur les paramètres à l'avance, et de les interpréter pleinement (éventuellement avec des conseils). c'est-à-dire que la valeur "ressemble" à un int, à une chaîne ou à une date.Comment désérialiser en utilisant JSON.Net à un type anonyme?

Le seul moyen que je connaisse est de créer un type anonyme dont vous avez connaissance. Voir la méthode .DeserializeAnonymousType (...) ci-dessous.

Quelqu'un peut-il faire mieux que cela? Merci.

 var jsonString = "{\"user_id\": 1, \"user_type\": \"moderator\", \"name\": \"Fred\"}"; 

     JToken root = JObject.Parse(jsonString); 

     var anonTemplate = new{user_id=0, user_type="", name="" }; 

     var a = JsonConvert.DeserializeAnonymousType(root.ToString(), anonTemplate); 


     var b = JsonConvert.DeserializeObject<Object>(root.ToString()); // actually turns into a JsonObject which is something differet. 

Mise à jour

J'ai téléchargé dynamicduck et je joue avec un peu. Est-ce que cette idée bizarre de "wrapper" de Brian sera utilisable de la manière dont j'ai besoin (sérialisable, etc)?

http://weblogs.asp.net/britchie/archive/2010/08/05/json-net-dynamic-extensions.aspx

http://weblogs.asp.net/britchie/archive/2010/08/03/dynamicduck-duck-typing-in-a-dynamic-world.aspx

+0

Dans le cas de .NET 4, je suppose que vous devriez pouvoir désérialiser l'objet 'dynamic', puis accéder explicitement aux propriétés requises – sll

+2

Comment avez-vous l'intention de consommer cet objet si vous ne savez pas quels paramètres il a ou devrait avoir avoir? – KallDrexx

+0

@sll: un exemple? Pas contre les types dynamiques. Je les utilise à l'occasion. Dans ce cas, ma prochaine question serait de savoir comment convertir un type dynamique en un type anon. Je suis satisfait de l'un ou l'autre de ces chemins, car la performance n'est pas un problème, cependant, j'ai * besoin * d'un type anon dans ce cas (bibliothèques existantes). – sgtz

Répondre

6

Vous pouvez désérialiser avec JSON.NET à un ExpandoObject utilisant le ExpandoObjectConverter.

Pour créer un type anonyme lors de l'exécution, son tout à fait un peu plus compliqué, jetez un oeil sur les cerceaux ont sauté à travers dans ce fil:

How to create LINQ Expression Tree to select an anonymous type

Comme vous pouvez le voir un peu d'effort Cela ne vaut probablement pas le coup, car vous n'obtiendrez toujours pas de sécurité en temps de compilation. Donc, un dynamic ou ExpandoObject sont vos meilleurs paris.

+1

avez-vous un exemple d'utilisation de ExpandoObjectConverter que vous pourriez lier? – sgtz

Questions connexes