web-dev-qa-db-fra.com

Convertir un objet de tout type en JObject avec Json.NET

J'ai souvent besoin d'étendre mon modèle de domaine avec des informations supplémentaires avant de le renvoyer au client avec WebAPI. Pour éviter la création de ViewModel, je pensais pouvoir renvoyer JObject avec des propriétés supplémentaires. Je ne pouvais cependant pas trouver le moyen direct de convertir un objet de tout type en JObject avec un seul appel à la bibliothèque Newtonsoft JSON. Je suis venu avec quelque chose comme ça:

  1. premier SerializeObject
  2. puis Parse
  3. et étendre JObject

Par exemple.:

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;

Je cette manière correcte? 

64
dragonfly

JObject implémente IDictionary, vous pouvez donc l'utiliser de cette façon. Pour ex,

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

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

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

Donc, le json final sera

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

Vous pouvez également utiliser le mot clé dynamic

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

Si vous avez un objet et souhaitez devenir JObject, vous pouvez utiliser:

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

comme ça : 

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

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

Cela fonctionnera:

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;
0