Json.NET ile her tür nesneyi JObject'e dönüştürün


89

WebAPI ile istemciye iade etmeden önce Etki Alanı modelimi ek bilgilerle genişletmem gerekir. ViewModel'in oluşturulmasını önlemek için JObject'i ek özelliklerle döndürebileceğimi düşündüm. Bununla birlikte, Newtonsoft JSON kitaplığına yapılan tek çağrı ile herhangi bir nesneyi JObject'e dönüştürmenin doğrudan yolunu bulamadım. Bunun gibi bir şey buldum:

  1. ilk SerializeObject
  2. sonra Ayrıştır
  3. ve JObject'i genişlet

Örneğin.:

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;

Bu doğru yol muyum?


17
JObject.FromObject(your_domain_object)aradığınız şey. @ LB'nin cevabına bakın.
Brian Rogers

Yanıtlar:


123

JObject, IDictionary uygular, böylece onu bu şekilde kullanabilirsiniz. Örneğin,

var cycleJson  = JObject.Parse(@"{""name"":""john""}");

//add surname
cycleJson["surname"] = "doe";

//add a complex object
cycleJson["complexObj"] = JObject.FromObject(new { id = 1, name = "test" });

Böylece son json olacak

{
  "name": "john",
  "surname": "doe",
  "complexObj": {
    "id": 1,
    "name": "test"
  }
}

Ayrıca dynamicanahtar kelime de kullanabilirsiniz

dynamic cycleJson  = JObject.Parse(@"{""name"":""john""}");
cycleJson.surname = "doe";
cycleJson.complexObj = JObject.FromObject(new { id = 1, name = "test" });

Cevabınız için teşekkürler, ancak ek diş telleri ile cycleJson'u değerlendirirken aşağıdaki json'ı alıyorum. Bu ek parantezleri nasıl çıkarabilirim ??? {{"name": "john", "surname": "doe", "complexObj": {"id": 1, "name": "test"}}}
remya thekkuvettil

@remyathekkuvettil geçerli bir json değil. Bazı anlık dize işlemlerine ihtiyacınız var.
LB

29

Bir nesneniz varsa ve JObject olmak istiyorsanız, şunları kullanabilirsiniz:

JObject o = (JObject)JToken.FromObject(miObjetoEspecial);

bunun gibi :

Pocion pocionDeVida = new Pocion{
tipo = "vida",
duracion = 32,
};

JObject o = (JObject)JToken.FromObject(pocionDeVida);
Console.WriteLine(o.ToString());
// {"tipo": "vida", "duracion": 32,}

10
Neden doğrudan (JObject) JToken.FromObject () yerine JObject.FromObject () değil?
tomexou

bana birSystem.InvalidCastException
superninja

1

Bu çalışacak:

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.