A menudo necesito ampliar mi modelo de dominio con información adicional antes de devolverlo al cliente con WebAPI. Para evitar la creación de ViewModel, pensé que podría devolver JObject con propiedades adicionales. Sin embargo, no pude encontrar una forma directa de convertir un objeto de cualquier tipo a JObject con una sola llamada a la biblioteca Newtonsoft JSON. Se me ocurrió algo como esto:
- primer SerializeObject
- luego Parse
- y extender JObject
P.ej.:
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;
Yo de esta manera correcta?
JObject.FromObject(your_domain_object)
es lo que estas buscando. Vea la respuesta de @ LB.Respuestas:
JObject implementa IDictionary, por lo que puede usarlo de esa manera. Por ex,
var cycleJson = JObject.Parse(@"{""name"":""john""}"); //add surname cycleJson["surname"] = "doe"; //add a complex object cycleJson["complexObj"] = JObject.FromObject(new { id = 1, name = "test" });
Entonces el json final será
{ "name": "john", "surname": "doe", "complexObj": { "id": 1, "name": "test" } }
También puede utilizar
dynamic
palabras clavedynamic cycleJson = JObject.Parse(@"{""name"":""john""}"); cycleJson.surname = "doe"; cycleJson.complexObj = JObject.FromObject(new { id = 1, name = "test" });
fuente
Si tiene un objeto y desea convertirse en JObject, puede usar:
Me gusta esto :
Pocion pocionDeVida = new Pocion{ tipo = "vida", duracion = 32, }; JObject o = (JObject)JToken.FromObject(pocionDeVida); Console.WriteLine(o.ToString()); // {"tipo": "vida", "duracion": 32,}
fuente
System.InvalidCastException
Esto funcionará:
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;
fuente