在这篇文章中,我将解释如何使用Newtonsoft.Json来处理动态和ExpandoObject对象。它在某些情况下是有用的。如果您想了解使用Newtonsoft.Json进行序列化和反序列化的基本原理,请参阅我最近的文章。
什么是ExpandoObject?
ExpandoObject类型的对象是可以在运行时动态添加和删除其成员的对象。此类型位于System.Dynamic命名空间中。
在C#中什么是动态?
Dynamic基本上表示一个对象,该对象的操作将在运行时解析。
我正在使用控制台应用程序,Program.cs文件如下所示:
class Program { static void Main(string[] args) { Console.Clear(); DynamicExpandoObjectDemo.ShowDemo(); Console.ReadLine(); } }
如您所见,我有一个名为dynamicxpandoobjectdemo的类,它有一个名为ShowDemo的静态方法,如下所示:
public class DynamicExpandoObjectDemo { public static void ShowDemo() { dynamic author = new ExpandoObject(); author.Title = "Mr."; author.Name = "Sid"; author.City = "London"; var authorData = JsonConvert.SerializeObject(author, Formatting.Indented); Console.WriteLine(Environment.NewLine + authorData); dynamic newAuthor = JsonConvert.DeserializeObject(authorData); Console.WriteLine($"{Environment.NewLine}{newAuthor.Title} {newAuthor.Name} is from {newAuthor.City}"); } }
现在让我们理解上面的代码。
- 第5行创建了一个ExpandoObject类型的动态对象,此时没有定义任何成员。第6-8行,向这个新对象添加三个新成员。
- 接下来,在第10行,使用格式化选项序列化对象,以便在控制台中正确格式化输出。我们得到的结果是字符串类型。
- 然后在第13行使用相同的string对象进行反序列化。注意,反序列化方法没有使用任何特定类型,并且名为newAuthor的对象是动态的。
此程序的输出在控制台中如下所示:
{
"Title": "Mr.",
"Name": "Sid",
"City": "London"
}
Mr. Sid is from London
如您所见,当数据的具体类型未知时,处理数据非常简单。ExpandoObject和动态对象非常强大,但同时也更容易产生风险。在尝试从动态对象获取成员之前,请始终确保已准备好保护子句/检查。
我希望这能解释如何将Newtonsoft.Json用于动态和ExpandoObject对象。