使用Json.net将对象直接序列化为JObject而不是字符串

51

如何将一个对象直接序列化为 JSON.Net 中的 JObject 实例?通常做法是将对象直接转换成 json 字符串,像这样:

string jsonSTRINGResult = JsonConvert.SerializeObject(someObj);

然后,可以按照以下方式将其反序列化回JObject:

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

看起来这样做是可行的,但这种方式似乎有双重性能损失(序列化然后反序列化)。SerializeObject内部是否使用可以访问的JObject?或者是否有一种直接将其序列化为JObject的方法?


1
为什么你想在代码中使用 JObject 而不是本地类型/类? - Kris Oye
http://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JObject_FromObject.htm - Eser
简而言之,它允许Json.Net处理所有困难的序列化工作,使我能够对最终序列化结果进行一些想要的操作,这将不是json。如果您想知道(尽管这与特定问题无关),我想以属性用于属性的方式将其序列化为XML,而不是像JSON.Net XML序列化器(可以理解)那样使用XML子元素,并进行一些其他自定义。 - Nicholas Petersen
Eser,请将其作为答案发布,只需确保给出一个一行代码示例(在这里:JObject.FromObject(obj))。就这样! - Nicholas Petersen
2
很棒的问题,我正在寻找这个。当您使用自定义JSON序列化或构建支持多种序列化格式的序列化框架时,这非常方便。+1 - sɐunıɔןɐqɐp
3个回答

79

注意,这与SerializeObject + DeserializeObject不等同。此函数的输出略有不同,使用JToken.DeepEquals比较两者很可能是“false”。这是由于在de / serialization期间部分信息的丢失,而FromObject不模拟。如果您想模仿从REST API接收到的对象,则可能无法正常工作。 - wondra

21
请注意,在Eser's accepted answer中建议的JObject路由仅适用于非数组CLR对象。如果您尝试将数组对象转换为JObject,它会导致以下异常:

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

其他信息:无法将类型为 'Newtonsoft.Json.Linq.JArray' 的对象强制转换为类型 'Newtonsoft.Json.Linq.JObject'。

所以,如果是数组对象,则应使用下面代码片段中所示的JArray
using Newtonsoft.Json.Linq;

JArray jArray = JArray.FromObject(someArrayObject);

11

为了将所有内容组合起来:在所有情况下都使用JToken(包括对象和数组)。

JToken token = JToken.FromObject(someObjectOrArray);

然后通过检查 token.Type 确定它是哪种类型的JTokenType(对象、数组或其他类型)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接