【问题标题】:Convert object of any type to JObject with Json.NET使用 Json.NET 将任何类型的对象转换为 JObject
【发布时间】:2014-03-26 07:40:45
【问题描述】:

在使用 WebAPI 将其返回给客户端之前,我经常需要使用附加信息扩展我的域模型。为了避免创建 ViewModel,我想我可以返回带有附加属性的 JObject。然而,我无法找到直接方法将任何类型的对象转换为 JObject,只需调用 Newtonsoft JSON 库即可。我想出了这样的事情:

  1. 第一个 SerializeObject
  2. 然后解析
  3. 并扩展 JObject

例如:

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;

我这个方法正确吗?

【问题讨论】:

  • JObject.FromObject(your_domain_object) 是您正在寻找的。请参阅@L.B 的回答。

标签: c# .net json.net


【解决方案1】:

这将起作用:

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;

【讨论】:

    【解决方案2】:

    如果您有一个对象并希望成为 JObject,您可以使用:

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

    像这样:

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

    【讨论】:

    • 为什么不直接用 JObject.FromObject() 而不是 (JObject)JToken.FromObject() 呢?
    • 它给了我一个System.InvalidCastException
    【解决方案3】:

    JObject 实现了 IDictionary,因此您可以这样使用它。例如,

    var cycleJson  = JObject.Parse(@"{""name"":""john""}");
    
    //add surname
    cycleJson["surname"] = "doe";
    
    //add a complex object
    cycleJson["complexObj"] = JObject.FromObject(new { id = 1, name = "test" });
    

    所以最终的 json 将是

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

    你也可以使用dynamic关键字

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

    【讨论】:

    • 感谢您的回答。但我在评估 cycleJson 时得到了下面的 json,并带有额外的大括号。我怎样才能删除额外的大括号??? {{ "name": "john", "surname": "doe", "complexObj": { "id": 1, "name": "test" } }}
    • @remyathekkuvettil 它不是一个有效的 json。您需要一些临时字符串操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2020-04-18
    • 2016-08-02
    相关资源
    最近更新 更多