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?

capung
sumber
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" });
LB
sumber
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,}
Condemateguadua
sumber
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;
TheEmirOfGroofunkistan
sumber