Converti oggetti di qualsiasi tipo in JObject con Json.NET


89

Spesso ho bisogno di estendere il mio modello di dominio con informazioni aggiuntive prima di restituirlo al client con WebAPI. Per evitare la creazione di ViewModel ho pensato di poter restituire JObject con proprietà aggiuntive. Non sono riuscito tuttavia a trovare un modo diretto per convertire oggetti di qualsiasi tipo in JObject con una singola chiamata alla libreria JSON di Newtonsoft. Ho pensato a qualcosa del genere:

  1. primo SerializeObject
  2. poi Parse
  3. ed estendi JObject

Per esempio.:

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;

Io in questo modo corretto?


17
JObject.FromObject(your_domain_object)è quello che stai cercando. Vedi la risposta di @ LB.
Brian Rogers

Risposte:


123

JObject implementa IDictionary, quindi puoi usarlo in questo modo. Ad esempio,

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

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

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

Quindi il json finale sarà

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

Puoi anche usare la dynamicparola chiave

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

Grazie per la tua risposta Ma sto ottenendo il json di seguito durante la valutazione di cycleJson, con parentesi graffe aggiuntive. Come posso rimuovere le parentesi graffe aggiuntive ??? {{"name": "john", "surname": "doe", "complexObj": {"id": 1, "name": "test"}}}
remya thekkuvettil

@remyathekkuvettil non è un json valido. Hai bisogno di alcune manipolazioni di stringhe ad hoc.
LB

29

Se hai un oggetto e desideri diventare JObject puoi utilizzare:

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

come questo :

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

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

10
Perché non JObject.FromObject () invece di (JObject) JToken.FromObject () direttamente?
tomexou

mi ha dato unSystem.InvalidCastException
superninja il

1

Questo funzionerà:

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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.