【问题标题】:Serialize an object directly to a JObject instead of to a string in json.net将对象直接序列化为 JObject 而不是 json.net 中的字符串
【发布时间】:2021-10-18 19:40:39
【问题描述】:

如何将一个对象直接序列化为 JSON.Net 中的 JObject 实例?通常所做的是将对象直接转换为 json string,如下所示:

string jsonSTRINGResult = JsonConvert.SerializeObject(someObj);

然后可以将其反序列化JObject,如下所示:

JObject jObj = JsonConvert.DeserializeObject<JObject>(jsonSTRINGResult);

这似乎可行,但似乎这种方式具有双重性能影响(序列化然后反序列化)。 SerializeObject 内部是否使用了可以以某种方式访问​​的 JObject?或者有什么方法可以直接序列化为JObject

【问题讨论】:

  • 为什么要在代码中使用 JObject 而不是原生类型/类?
  • 简而言之,它允许 Json.Net 处理所有硬序列化的东西,允许我对最终的序列化结果做一些我想做的事情,这不会是 json。如果您想知道(尽管这与特定问题无关),我想以一种将属性用于属性而不是 XML 子元素的方式序列化为 XML,就像 JSON.Net XML 序列化程序(可以理解)那样,使用也许还有一些其他的自定义。
  • Eser,请将其发布为答案,只需确保给出一个单行代码示例(这里是:JObject.FromObject(obj))。还是可以的!
  • 好问题,我正在寻找这个问题。当您使用自定义 json 序列化或构建支持多种序列化格式的序列化框架时,这会非常方便。 +1

标签: c# json serialization json.net


【解决方案1】:

你可以使用FromObjectJObject的静态方法

JObject jObj = JObject.FromObject(someObj)

http://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JObject_FromObject.htm

【讨论】:

    【解决方案2】:

    请注意@Eser 建议的JObject 路由适用于非数组CLR 对象。如果您尝试将 Array 对象转换为 JObject,则会导致以下异常:

    发生了“System.InvalidCastException”类型的未处理异常 在 Newtonsoft.Json.dll 中

    附加信息:无法转换类型的对象 'Newtonsoft.Json.Linq.JArray' 输入 'Newtonsoft.Json.Linq.JObject'。

    所以,如果它是一个数组对象,那么您应该使用JArray 代替,如下面的代码 sn-p 所示:

    using Newtonsoft.Json.Linq;
    
    JArray jArray = JArray.FromObject(someArrayObject);
    

    【讨论】:

      【解决方案3】:

      要组合所有内容:对所有内容(对象和数组)使用 JToken。

      JToken token = JToken.FromObject(someObjectOrArray);
      

      然后检查token.Type是哪个JTokenType(对象、数组或其他)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-03
        • 1970-01-01
        • 2017-03-21
        • 1970-01-01
        • 2013-07-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多