Konvertieren Sie mit Json.NET ein Objekt eines beliebigen Typs in JObject

88

Ich muss mein Domain-Modell häufig um zusätzliche Informationen erweitern, bevor ich es mit WebAPI an den Client zurückgeben kann. Um die Erstellung von ViewModel zu vermeiden, dachte ich, ich könnte JObject mit zusätzlichen Eigenschaften zurückgeben. Ich konnte jedoch keinen direkten Weg finden, um Objekte jeglicher Art mit einem einzigen Aufruf der Newtonsoft JSON-Bibliothek in JObject zu konvertieren. Ich habe mir so etwas ausgedacht:

  1. erstes SerializeObject
  2. dann analysieren
  3. und erweitern Sie JObject

Z.B.:

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;

Ich das richtig?

Libelle
quelle
17
JObject.FromObject(your_domain_object)ist was Sie suchen. Siehe die Antwort von @ LB.
Brian Rogers

Antworten:

123

JObject implementiert IDictionary, sodass Sie es auf diese Weise verwenden können. Zum Beispiel

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

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

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

So wird der letzte json sein

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

Sie können auch ein dynamicSchlüsselwort verwenden

dynamic cycleJson  = JObject.Parse(@"{""name"":""john""}");
cycleJson.surname = "doe";
cycleJson.complexObj = JObject.FromObject(new { id = 1, name = "test" });
PFUND
quelle
Vielen Dank für Ihre Antwort. Aber ich erhalte den folgenden JSON bei der Bewertung von CycleJson mit zusätzlichen Klammern. Wie kann ich diese zusätzlichen Klammern entfernen ??? {{"name": "john", "nachname": "doe", "complexObj": {"id": 1, "name": "test"}}}
remya thekkuvettil
@remyathekkuvettil es ist kein gültiger json. Sie benötigen einige Ad-hoc-Zeichenfolgenmanipulationen.
LB
25

Wenn Sie ein Objekt haben und JObject werden möchten, können Sie Folgendes verwenden:

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

so was :

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

JObject o = (JObject)JToken.FromObject(pocionDeVida);
Console.WriteLine(o.ToString());
// {"tipo": "vida", "duracion": 32,}
Condemateguadua
quelle
9
Warum nicht JObject.FromObject () anstelle von (JObject) JToken.FromObject () direkt?
Toméxou
es gab mir eineSystem.InvalidCastException
Superninja
1

Das wird funktionieren:

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
quelle