J'ai souvent besoin d'étendre mon modèle de domaine avec des informations supplémentaires avant de le renvoyer au client avec WebAPI. Pour éviter la création de ViewModel, j'ai pensé que je pourrais renvoyer JObject avec des propriétés supplémentaires. Je n'ai cependant pas pu trouver de moyen direct de convertir un objet de tout type en JObject avec un seul appel à la bibliothèque Newtonsoft JSON. J'ai trouvé quelque chose comme ça:
- premier SerializeObject
- puis Parse
- et étendre JObject
Par exemple.:
var cycles = cycleSource.AllCycles();
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var vm = new JArray();
foreach (var cycle in cycles)
{
var cycleJson = JObject.Parse(JsonConvert.SerializeObject(cycle, settings));
// extend cycleJson ......
vm.Add(cycleJson);
}
return vm;
Je de cette manière correcte?
JObject.FromObject(your_domain_object)
est ce que vous recherchez. Voir la réponse de @ LB.Réponses:
JObject implémente IDictionary, vous pouvez donc l'utiliser de cette façon. Par exemple,
var cycleJson = JObject.Parse(@"{""name"":""john""}"); //add surname cycleJson["surname"] = "doe"; //add a complex object cycleJson["complexObj"] = JObject.FromObject(new { id = 1, name = "test" });
Donc le json final sera
{ "name": "john", "surname": "doe", "complexObj": { "id": 1, "name": "test" } }
Vous pouvez également utiliser le
dynamic
mot-clédynamic cycleJson = JObject.Parse(@"{""name"":""john""}"); cycleJson.surname = "doe"; cycleJson.complexObj = JObject.FromObject(new { id = 1, name = "test" });
la source
Si vous avez un objet et souhaitez devenir JObject, vous pouvez utiliser:
comme ça :
Pocion pocionDeVida = new Pocion{ tipo = "vida", duracion = 32, }; JObject o = (JObject)JToken.FromObject(pocionDeVida); Console.WriteLine(o.ToString()); // {"tipo": "vida", "duracion": 32,}
la source
System.InvalidCastException
Cela fonctionnera:
var cycles = cycleSource.AllCycles(); var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; var vm = new JArray(); foreach (var cycle in cycles) { var cycleJson = JObject.FromObject(cycle); // extend cycleJson ...... vm.Add(cycleJson); } return vm;
la source