Ubah objek jenis apa pun menjadi JObject dengan Json.NET


89

Saya sering kali perlu memperluas model Domain saya dengan info tambahan sebelum mengembalikannya ke klien dengan WebAPI. Untuk menghindari pembuatan ViewModel, saya pikir saya bisa mengembalikan JObject dengan properti tambahan. Namun saya tidak dapat menemukan cara langsung untuk mengonversi objek jenis apa pun ke JObject dengan panggilan tunggal ke perpustakaan Newtonsoft JSON. Saya menemukan sesuatu seperti ini:

  1. SerializeObject pertama
  2. lalu Parse
  3. dan memperpanjang JObject

Misalnya.:

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;

Saya ini cara yang benar?


17
JObject.FromObject(your_domain_object)adalah apa yang Anda cari. Lihat jawaban @ LB.
Brian Rogers

Jawaban:


123

JObject mengimplementasikan IDictionary, jadi Anda bisa menggunakannya seperti itu. Misalnya,

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

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

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

Jadi json terakhir adalah

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

Anda juga bisa menggunakan dynamickata kunci

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

Terima kasih atas jawaban Anda Tapi saya mendapatkan json di bawah ini saat mengevaluasi cycleJson, dengan kawat gigi tambahan. Bagaimana cara menghapus kawat gigi tambahan itu ??? {{"name": "john", "surname": "doe", "complexObj": {"id": 1, "name": "test"}}}
remya thekkuvettil

@remyathekkuvettil ini bukan json yang valid. Anda membutuhkan beberapa manipulasi string ad-hoc.
LB

29

Jika Anda memiliki objek dan ingin menjadi JObject, Anda dapat menggunakan:

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

seperti ini :

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

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

10
Mengapa tidak JObject.FromObject () dan bukan (JObject) JToken.FromObject () secara langsung?
tomexou

itu memberi sayaSystem.InvalidCastException
superninja

1

Ini akan berhasil:

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;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.