将 JSON 字符串转换为 C# 对象

Fil Zjazel Romaeus Villegas 2023年10月12日
  1. 使用 Newtonsoft.Json 将 JSON 字符串转换为 C# 对象
  2. 使用 JavaScriptSerializer 将 JSON 字符串转换为 C# 对象
  3. 将 JSON 字符串转换为 C# 对象代码示例
将 JSON 字符串转换为 C# 对象

本教程将演示如何使用两种不同的方法将 JSON 字符串转换为 C# 对象。

第一个使用 Newtonsoft.Json 库,而第二个使用 JavaScriptSerializer。这两种方法相似,但使用的语法略有不同,并且需要不同的引用。

使用 Newtonsoft.Json 将 JSON 字符串转换为 C# 对象

Newtonsoft.Json 库是 .NET 的常用 JSON 框架。在将软件包安装到你的解决方案后,可以使用此库。你可以使用带有以下命令的 .NET CLI 来安装软件包。

> dotnet add package Newtonsoft.Json --version 13.0.1

JSON 字符串可以转换为任何类型的 C# 对象,只要它是对象类型的有效 JSON 字符串即可。这是通过反序列化字符串、将其转换为指定类型 (T) 并提供输入 JSON 字符串来完成的。

JsonConvert.DeserializeObject<T>(json_string);

使用 JavaScriptSerializer 将 JSON 字符串转换为 C# 对象

将 JSON 字符串转换为 C# 对象的旧选项是 JavaScriptSerializer。虽然它没有 Newtonsoft.Json 解决方案那么快,但它仍然可以很好地利用。要使用此方法,你需要在项目中添加对 System.Web.Extensions.dll 的引用。

要添加该引用,请按照以下步骤操作。

  • 导航到解决方案资源管理器
  • 右键单击引用
  • 点击添加引用
  • 单击左侧的 Assemblies 选项卡
  • 找到 System.Web.Extensions.dll 文件并单击 OK

JavaScriptSerializer 的工作方式与 Newtonsoft.Json 方法类似,因为它只需要 JSON 字符串和要反序列化的类型。

JavaScriptSerializer().Deserialize<T>(json_string)

将 JSON 字符串转换为 C# 对象代码示例

下面的代码示例演示了如何使用 JsonConvert.DeserializeObject<T>JavaScriptSerializer 函数将 JSON 字符串转换为任何类型的 C# 对象。对于此示例,我们将字符串转换为包含整数的列表对象 (List<Int32>) 以及我们在程序中指定的自定义类。

using Newtonsoft.Json;
using System.Data;
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Web.Script.Serialization;

namespace JSON_To_Object_Example {
  class Program {
    static void Main(string[] args) {
      // Declare the JSON Strings
      string list_str = "[1, 2, 3, 9, 8, 7]";
      string custom_class_str =
          "{ \"Name\":\"John Doe\",\"Age\":21,\"Birthday\":\"2000-01-01T00:00:00\"}";

      // ----- Newtonsoft Method -----
      // Deserialize the string by specifying the object type
      List<Int32> list_converted_ns = JsonConvert.DeserializeObject<List<Int32>>(list_str);

      // Print the contents of the newly converted List object to the Console.
      Console.WriteLine("Converted List - Newtonsoft: " + String.Join(", ", list_converted_ns) +
                        "\n");

      // The same can be done for any type of C# object, including custom classes. Just change the
      // specified Type.
      Custom_Class class_converted_ns =
          JsonConvert.DeserializeObject<Custom_Class>(custom_class_str);
      Console.WriteLine("Converted Class - Newtonsoft:");
      PrintPropreties(class_converted_ns);

      Console.WriteLine("\n\n");

      // ----- JavaScriptSerializer Method -----
      // Deserialize the string by specifying the object type
      List<Int32> list_converted_js = new JavaScriptSerializer().Deserialize<List<Int32>>(list_str);
      Console.WriteLine(
          "Converted List - JavaScriptSerializer: " + String.Join(", ", list_converted_js) + "\n");

      Custom_Class class_converted_js =
          new JavaScriptSerializer().Deserialize<Custom_Class>(custom_class_str);
      Console.WriteLine("Converted Class - JavaScriptSerializer:");
      PrintPropreties(class_converted_js);
      Console.ReadLine();
    }

    public class Custom_Class {
      // Custom Class created for the purposes of this tutorial
      public string Name { get; set; }
      public int Age { get; set; }
      public DateTime Birthday { get; set; }
    }

    public static void PrintPropreties(object obj) {
      // Uses the System.Component Model to read each property of a class and print its value
      foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(obj)) {
        string name = descriptor.Name;
        object value = descriptor.GetValue(obj);
        Console.WriteLine("{0}: {1}", name, value);
      }
    }
  }
}

此代码将输出由逗号连接的整数列表以及转换后的自定义类中的所有属性。你可以观察到两种方法都会产生相同的输出。

输出:

Converted List - Newtonsoft: 1, 2, 3, 9, 8, 7

Converted Class - Newtonsoft:
Name: John Doe
Age: 21
Birthday: 01/01/2000 12:00:00 am



Converted List - JavaScriptSerializer: 1, 2, 3, 9, 8, 7

Converted Class - JavaScriptSerializer:
Name: John Doe
Age: 21
Birthday: 01/01/2000 12:00:00 am

相关文章 - Csharp JSON

相关文章 - Csharp Object