Konwertuj obiekt dowolnego typu na JObject za pomocą Json.NET

89

Często muszę rozszerzyć mój model domeny o dodatkowe informacje, zanim zwrócę go klientowi za pomocą WebAPI. Pomyślałem, że aby uniknąć tworzenia ViewModel, mogę zwrócić JObject z dodatkowymi właściwościami. Nie mogłem jednak znaleźć bezpośredniego sposobu na konwersję dowolnego typu obiektu do JObject za pomocą pojedynczego wywołania biblioteki Newtonsoft JSON. Wymyśliłem coś takiego:

  1. pierwszy SerializeObject
  2. następnie Parse
  3. i rozszerz JObject

Na przykład.:

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;

I w ten poprawny sposób?

ważka
źródło
17
JObject.FromObject(your_domain_object)jest tym, czego szukasz. Zobacz odpowiedź @ LB.
Brian Rogers

Odpowiedzi:

123

JObject implementuje IDictionary, więc możesz go używać w ten sposób. Na przykład

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

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

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

Więc ostatni json będzie

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

Możesz także użyć dynamicsłowa kluczowego

dynamic cycleJson  = JObject.Parse(@"{""name"":""john""}");
cycleJson.surname = "doe";
cycleJson.complexObj = JObject.FromObject(new { id = 1, name = "test" });
FUNT
źródło
Dziękuję za odpowiedź, ale otrzymuję poniższy plik json podczas oceny cycleJson z dodatkowymi nawiasami klamrowymi. Jak mogę usunąć te dodatkowe szelki ??? {{"name": "john", "sename": "doe", "complexObj": {"id": 1, "name": "test"}}}
remya thekkuvettil
@remyathekkuvettil to nie jest prawidłowy plik json. Potrzebujesz manipulacji ciągiem ad-hoc.
LB
28

Jeśli masz obiekt i chcesz zostać JObject, możesz użyć:

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

lubię to :

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

JObject o = (JObject)JToken.FromObject(pocionDeVida);
Console.WriteLine(o.ToString());
// {"tipo": "vida", "duracion": 32,}
Condemateguadua
źródło
9
Dlaczego nie bezpośrednio JObject.FromObject () zamiast (JObject) JToken.FromObject ()?
tomexou
dało mi toSystem.InvalidCastException
superninja
1

To zadziała:

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
źródło