Newtonsoft Json Sérialiseur/Deserializer - comment faire pour utiliser des objets génériques au lieu de JObject?

J'ai JSON spécifié par un service restful je suis de consommation qui ressemble à ceci (exemple):

{
  "id": "97",
  "name": "Tom Production",
  "description": null,
  "parameters": [
    {
      "first_parameter_name": "First Parameter Value"
    },
    {
      "second_parameter_name": "Second Parameter Value"
    }
  ]
}

Noter que les noms de propriété id, nom, description et les paramètres sont tous établis dans le cadre de la spécification. La collection de paramètres génériques, montré dans mon exemple "first_parameter_name" et "second_parameter_name" ne sont pas spécifiés.... pourrait être n'importe quoi et je tiens à les cartographier de façon générique les objets de type.

Je l'ai déclaré à un objet pour ce qu':

[DataContract (Name = "MyClass")]
public class MyClass
{
    [DataMember (Name = "id")]
    public string Id { get; set; }

    [DataMember(Name = "name")]
    public string Name { get; set; }

    [DataMember(Name = "description")]
    public string Description { get; set; }

    [DataMember(Name = "parameters")]
    public List<object> Parameters { get; set; }
}

Sérialisation fonctionne très bien, exactement comme je m'attends à:

        var myObject = new MyClass();
        myObject.Id = "97";
        myObject.Name = "Tom Production";
        myObject.Parameters = new List<object>();
        myObject.Parameters.Add(new { first_parameter_name = "First Parameter Value" });
        myObject.Parameters.Add(new { second_parameter_name = "Second Parameter Value" });
        string json = JsonConvert.SerializeObject(myObject);
        Console.WriteLine(json);

les rendements du JSON, je suis à la recherche d', exactement comme en haut de cette page.

CEPENDANT.

Désérialisation ne fonctionne PAS bien. Si ça a marché, j'espère qu'il, serait de créer des types génériques comme j'avais créé, et le code suivant devrait fonctionner.... mais au lieu de cela, il lance une réflexion exception:

        var myNewObject = JsonConvert.DeserializeObject<MyClass>(json);

        foreach (object o in myNewObject.Parameters)
        {
            Type t = o.GetType();
            Console.WriteLine("\tType is {0}", t);
            foreach (PropertyInfo pi in t.GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                Console.WriteLine("\t\tName is {0}", pi.Name);
                Console.WriteLine("\t\tValue is {0}", pi.GetValue(o, null));
            }
        }

Au lieu de cela, je dois écrire le code qui est Newtonsoft spécifiques (ick) à utiliser une sorte de faux Newtonsoft réflexion:

        var myNewObject = JsonConvert.DeserializeObject<MyClass>(json);

        foreach (object o in myNewObject.Parameters)
        {
            var jo = o as JObject;
            if (jo != null)
            {
                foreach (JProperty prop in jo.Properties())
                {
                    Console.WriteLine("\t\tName is {0}", prop.Name);
                    Console.WriteLine("\t\tValue is {0}", prop.Value);
                }
            }
        }

Est-il un moyen que je peux contrôler le Deserializer de sorte qu'il va générer le bon types génériques plutôt que la JObject type avec le JProperties?

Merci beaucoup à l'avance.

Anonyme types à la compilation des classes. Vous pouvez les créer dans votre code, car le compilateur met en place les classes concrètes pour vous dans les coulisses. Lorsque vous désérialisez, il n'est pas possible de re-créer les classes anonymes parce que les types sont dépendants du JSON, qui n'est connue qu'à l'exécution. C'est pourquoi Json.Net ne peut pas recréer les types anonymes. La solution est d'utiliser un List<Dictionary<string, string>> comme @Tim S. suggéré.
Si vous avez trouvé une solution à votre problème, puis après, comme une réponse à la question, non pas comme une modification à la question elle-même. Si la réponse est suffisante, alors il n'y a même pas besoin de le faire; il suffit de le laisser comme il est.

OriginalL'auteur Stephan G | 2015-01-09