Converta objetos de qualquer tipo em JObject com Json.NET

89

Freqüentemente, preciso estender meu modelo de domínio com informações adicionais antes de devolvê-lo ao cliente com WebAPI. Para evitar a criação de ViewModel, pensei que poderia retornar JObject com propriedades adicionais. No entanto, não consegui encontrar uma maneira direta de converter objetos de qualquer tipo em JObject com uma única chamada para a biblioteca JSON da Newtonsoft. Eu vim com algo assim:

  1. primeiro SerializeObject
  2. então Analise
  3. e estender JObject

Por exemplo.:

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 esta maneira correta?

libélula
fonte
17
JObject.FromObject(your_domain_object)é o que você está procurando. Veja a resposta de @LB.
Brian Rogers

Respostas:

123

JObject implementa IDictionary, para que você possa usá-lo dessa forma. Por 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" });

Então, o json final será

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

Você também pode usar dynamicpalavras-chave

dynamic cycleJson  = JObject.Parse(@"{""name"":""john""}");
cycleJson.surname = "doe";
cycleJson.complexObj = JObject.FromObject(new { id = 1, name = "test" });
LIBRA
fonte
Obrigado pela sua resposta. Mas estou recebendo o json abaixo enquanto avalia o cycleJson, com chaves adicionais. Como posso remover esse colchete adicional ??? {{"nome": "john", "sobrenome": "doe", "complexObj": {"id": 1, "nome": "teste"}}}
remya thekkuvettil
@remyathekkuvettil não é um json válido. Você precisa de algumas manipulações de string ad-hoc.
LB
28

Se você tem um objeto e deseja se tornar um JObject, pode usar:

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

como isso :

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

JObject o = (JObject)JToken.FromObject(pocionDeVida);
Console.WriteLine(o.ToString());
// {"tipo": "vida", "duracion": 32,}
Condemateguadua
fonte
9
Por que não JObject.FromObject () em vez de (JObject) JToken.FromObject () diretamente?
tomexou
me deu umSystem.InvalidCastException
superninja
1

Isso vai funcionar:

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
fonte