Мне часто нужно расширить мою модель домена дополнительной информацией, прежде чем возвращать ее клиенту с помощью WebAPI. Чтобы избежать создания ViewModel, я подумал, что могу вернуть JObject с дополнительными свойствами. Однако мне не удалось найти прямой способ преобразовать объект любого типа в JObject с помощью одного вызова библиотеки Newtonsoft JSON. Я придумал что-то вроде этого:
- первый SerializeObject
- затем разобрать
- и расширить JObject
Например.:
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;
Я это правильно?
JObject.FromObject(your_domain_object)
это то, что вы ищете. См. Ответ @LB.Ответы:
JObject реализует IDictionary, поэтому вы можете использовать его таким образом. Например,
var cycleJson = JObject.Parse(@"{""name"":""john""}"); //add surname cycleJson["surname"] = "doe"; //add a complex object cycleJson["complexObj"] = JObject.FromObject(new { id = 1, name = "test" });
Итак, последний json будет
{ "name": "john", "surname": "doe", "complexObj": { "id": 1, "name": "test" } }
Вы также можете использовать
dynamic
ключевое словоdynamic cycleJson = JObject.Parse(@"{""name"":""john""}"); cycleJson.surname = "doe"; cycleJson.complexObj = JObject.FromObject(new { id = 1, name = "test" });
источник
Если у вас есть объект и вы хотите стать JObject, вы можете использовать:
как это :
Pocion pocionDeVida = new Pocion{ tipo = "vida", duracion = 32, }; JObject o = (JObject)JToken.FromObject(pocionDeVida); Console.WriteLine(o.ToString()); // {"tipo": "vida", "duracion": 32,}
источник
System.InvalidCastException
Это будет работать:
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;
источник