Często muszę rozszerzyć mój model domeny o dodatkowe informacje, zanim zwrócę go klientowi za pomocą WebAPI. Pomyślałem, że aby uniknąć tworzenia ViewModel, mogę zwrócić JObject z dodatkowymi właściwościami. Nie mogłem jednak znaleźć bezpośredniego sposobu na konwersję dowolnego typu obiektu do JObject za pomocą pojedynczego wywołania biblioteki Newtonsoft JSON. Wymyśliłem coś takiego:
- pierwszy SerializeObject
- następnie Parse
- i rozszerz JObject
Na przykład.:
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 w ten poprawny sposób?
JObject.FromObject(your_domain_object)
jest tym, czego szukasz. Zobacz odpowiedź @ LB.Odpowiedzi:
JObject implementuje IDictionary, więc możesz go używać w ten sposób. Na przykład
var cycleJson = JObject.Parse(@"{""name"":""john""}"); //add surname cycleJson["surname"] = "doe"; //add a complex object cycleJson["complexObj"] = JObject.FromObject(new { id = 1, name = "test" });
Więc ostatni json będzie
{ "name": "john", "surname": "doe", "complexObj": { "id": 1, "name": "test" } }
Możesz także użyć
dynamic
słowa kluczowegodynamic cycleJson = JObject.Parse(@"{""name"":""john""}"); cycleJson.surname = "doe"; cycleJson.complexObj = JObject.FromObject(new { id = 1, name = "test" });
źródło
Jeśli masz obiekt i chcesz zostać JObject, możesz użyć:
lubię to :
Pocion pocionDeVida = new Pocion{ tipo = "vida", duracion = 32, }; JObject o = (JObject)JToken.FromObject(pocionDeVida); Console.WriteLine(o.ToString()); // {"tipo": "vida", "duracion": 32,}
źródło
System.InvalidCastException
To zadziała:
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;
źródło