2014-02-24 13 views
49

Oft muss ich mein Domänenmodell mit zusätzlichen Informationen erweitern, bevor ich es mit WebAPI an den Client zurückschicke. 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 Objekt irgendeines Typs zu JObject mit einem einzigen Aufruf der Newtonsoft JSON Bibliothek zu konvertieren. Ich kam mit so etwas wie dies oben:Konvertieren von Objekten eines beliebigen Typs in JObject mit Json.NET

  1. erste SerializeObject
  2. dann
  3. Parse und erweitern JObject

Eg .:

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 diese richtige Weg?

+12

'JObject.FromObject (ihr_domain_object)' ist was du suchst. Siehe die Antwort von @ L.B. –

Antwort

74

JObject implementiert IDictionary, so dass Sie es auf diese Weise verwenden können. Für die 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" }); 

So wird die endgültige json

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

Sie auch dynamic Stichwort

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

Vielen Dank für Ihre Antwort. Aber ich bekomme die unten json während der Bewertung cycleJson, mit zusätzlichen Klammern. Wie kann ich diese zusätzlichen Klammern entfernen ??? {{ "name": "John", "Nachname": "doe", "complexObj": { "id": 1, "name": "test" } }} –

+0

@remyathekkuvettil Es ist kein gültiger JSON. Sie benötigen einige Ad-hoc-String-Manipulationen. –

7

Wenn Sie ein Objekt haben und wünschen können werden JObject Sie verwenden können:

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

gefällt das:

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

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

Warum nicht direkt JObject.FromObject() anstelle von (JObject) JToken.FromObject()? – tomexou

Verwandte Themen