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

89

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, j'ai pensé que je pourrais renvoyer JObject avec des propriétés supplémentaires. Je n'ai cependant pas pu trouver de moyen direct de convertir un objet de tout type en JObject avec un seul appel à la bibliothèque Newtonsoft JSON. J'ai trouvé 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 de cette manière correcte?

libellule
la source
17
JObject.FromObject(your_domain_object)est ce que vous recherchez. Voir la réponse de @ LB.
Brian Rogers

Réponses:

123

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

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 dynamicmot-clé

dynamic cycleJson  = JObject.Parse(@"{""name"":""john""}");
cycleJson.surname = "doe";
cycleJson.complexObj = JObject.FromObject(new { id = 1, name = "test" });
KG
la source
Merci pour votre réponse, mais j'obtiens le json ci-dessous lors de l'évaluation de cycleJson, avec des accolades supplémentaires. Comment puis-je supprimer ces accolades supplémentaires ??? {{"name": "john", "patronyme": "doe", "complexObj": {"id": 1, "name": "test"}}}
remya thekkuvettil
@remyathekkuvettil ce n'est pas un json valide. Vous avez besoin de quelques manipulations de chaînes ad hoc.
LB
28

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,}
Condemateguadua
la source
9
Pourquoi pas JObject.FromObject () au lieu de (JObject) JToken.FromObject () directement?
tomexou
il m'a donné unSystem.InvalidCastException
superninja
1

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;
TheEmirOfGroofunkistan
la source