Freqüentemente, preciso estender meu modelo de domínio com informações adicionais antes de devolvê-lo ao cliente com WebAPI. Para evitar a criação de ViewModel, pensei que poderia retornar JObject com propriedades adicionais. No entanto, não consegui encontrar uma maneira direta de converter objetos de qualquer tipo em JObject com uma única chamada para a biblioteca JSON da Newtonsoft. Eu vim com algo assim:
- primeiro SerializeObject
- então Analise
- e estender JObject
Por exemplo.:
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;
I esta maneira correta?
JObject.FromObject(your_domain_object)
é o que você está procurando. Veja a resposta de @LB.Respostas:
JObject implementa IDictionary, para que você possa usá-lo dessa forma. 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" });
Então, o json final será
{ "name": "john", "surname": "doe", "complexObj": { "id": 1, "name": "test" } }
Você também pode usar
dynamic
palavras-chavedynamic cycleJson = JObject.Parse(@"{""name"":""john""}"); cycleJson.surname = "doe"; cycleJson.complexObj = JObject.FromObject(new { id = 1, name = "test" });
fonte
Se você tem um objeto e deseja se tornar um JObject, pode usar:
como isso :
Pocion pocionDeVida = new Pocion{ tipo = "vida", duracion = 32, }; JObject o = (JObject)JToken.FromObject(pocionDeVida); Console.WriteLine(o.ToString()); // {"tipo": "vida", "duracion": 32,}
fonte
System.InvalidCastException
Isso vai 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;
fonte