[译]如何将Newtonsoft.Json用于动态和ExpandoObject对象?

作者:SIDDHARTH PANDEY原文地址

在这篇文章中,我将解释如何使用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对象。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

3 × 3 =