当前位置:首页 > 行业动态 > 正文

C#实现将类的内容写成JSON格式字符串的方法

C#实现将类的内容写成JSON格式字符串的方法:使用System.Text.Json命名空间中的JsonSerializer类,通过调用其Serialize方法,传入需要序列化的对象,即可得到该对象的JSON格式字符串表示。

在C#中,将类的内容转换为JSON格式字符串是一个常见的需求,尤其是在进行数据传输或存储时,下面将详细介绍如何使用C#实现这一功能。

一、使用Newtonsoft.Json库

安装Newtonsoft.Json

需要安装Newtonsoft.Json库,可以通过NuGet包管理器来安装:

Install Package Newtonsoft.Json

创建类并序列化为JSON

假设我们有一个简单的类Person

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

我们可以使用JsonConvert.SerializeObject方法将其转换为JSON格式字符串:

using Newtonsoft.Json;
class Program
{
    static void Main()
    {
        Person person = new Person { Name = "John Doe", Age = 30 };
        string jsonString = JsonConvert.SerializeObject(person);
        Console.WriteLine(jsonString);
    }
}

输出结果将是:

{"Name":"John Doe","Age":30}

反序列化JSON为类实例

同样地,可以使用JsonConvert.DeserializeObject方法将JSON字符串转换回类实例:

string jsonString = "{"Name":"Jane Doe","Age":25}";
Person deserializedPerson = JsonConvert.DeserializeObject<Person>(jsonString);
Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}");

输出结果将是:

Name: Jane Doe, Age: 25

二、使用System.Text.Json库(.NET Core 3.0+)

从.NET Core 3.0开始,微软提供了内置的JSON支持,即System.Text.Json命名空间。

创建类并序列化为JSON

使用System.Text.Json库,代码如下:

C#实现将类的内容写成JSON格式字符串的方法

using System.Text.Json;
class Program
{
    static void Main()
    {
        Person person = new Person { Name = "John Doe", Age = 30 };
        string jsonString = JsonSerializer.Serialize(person);
        Console.WriteLine(jsonString);
    }
}

输出结果与之前相同:

{"Name":"John Doe","Age":30}

反序列化JSON为类实例

反序列化操作也非常简单:

string jsonString = "{"Name":"Jane Doe","Age":25}";
Person deserializedPerson = JsonSerializer.Deserialize<Person>(jsonString);
Console.WriteLine($"Name: {deserializedPerson.Name}, Age: {deserializedPerson.Age}");

输出结果依然是:

Name: Jane Doe, Age: 25

三、处理复杂类型和嵌套对象

复杂类型示例

假设我们有一个更复杂的类结构:

public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
}
public class PersonWithAddress
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Address Address { get; set; }
}

使用Newtonsoft.Json进行序列化和反序列化:

using Newtonsoft.Json;
class Program
{
    static void Main()
    {
        PersonWithAddress person = new PersonWithAddress
        {
            Name = "John Doe",
            Age = 30,
            Address = new Address { Street = "123 Elm St", City = "Somewhere" }
        };
        string jsonString = JsonConvert.SerializeObject(person, Formatting.Indented);
        Console.WriteLine(jsonString);
    }
}

输出结果将是格式化后的JSON字符串:

{
  "Name": "John Doe",
  "Age": 30,
  "Address": {
    "Street": "123 Elm St",
    "City": "Somewhere"
  }
}

使用System.Text.Json进行相同的操作:

C#实现将类的内容写成JSON格式字符串的方法

using System.Text.Json;
class Program
{
    static void Main()
    {
        PersonWithAddress person = new PersonWithAddress
        {
            Name = "John Doe",
            Age = 30,
            Address = new Address { Street = "123 Elm St", City = "Somewhere" }
        };
        string jsonString = JsonSerializer.Serialize(person, new JsonSerializerOptions { WriteIndented = true });
        Console.WriteLine(jsonString);
    }
}

输出结果与Newtonsoft.Json类似。

四、自定义序列化和反序列化行为

有时需要自定义序列化和反序列化的行为,例如忽略某些属性或使用不同的属性名。

1. Newtonsoft.Json中的自定义设置

Newtonsoft.Json中,可以使用JsonProperty特性:

public class PersonWithCustomSettings
{
    [JsonProperty("full_name")]
    public string Name { get; set; }
    [JsonIgnore]
    public int Age { get; set; }
}

序列化时会忽略Age属性,并将Name属性序列化为full_name

2. System.Text.Json中的自定义设置

System.Text.Json中,可以使用JsonSerializerOptions进行配置:

C#实现将类的内容写成JSON格式字符串的方法

public class PersonWithCustomSettings
{
    [JsonPropertyName("full_name")]
    public string Name { get; set; }
}
// 序列化时忽略Age属性,并将Name属性序列化为full_name。

五、FAQs

Q1: 如果类中有循环引用,如何处理?

A1: 对于循环引用,可以在序列化时使用ReferenceLoopHandling.Ignore选项来避免无限递归,在Newtonsoft.Json中:

JsonConvert.SerializeObject(person, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });

System.Text.Json中:

var options = new JsonSerializerOptions { DefaultSerializerOptions = new JsonSerializerOptions { ReferenceHandler = ReferenceHandler.IgnoreCycles } };
JsonSerializer.Serialize(person, options);

Q2: 如何序列化只读字段或属性?

A2: 在Newtonsoft.Json中,可以使用JsonProperty特性并设置ReadOnlyFieldtrue

[JsonProperty(ItemIsReference = true)]
public readonly string ReadOnlyField;

System.Text.Json中,目前没有直接的方法来序列化只读字段,但可以通过构造函数或初始化列表来间接实现。

小编有话说:在C#中将类内容转换为JSON格式字符串是一项非常有用的技能,无论是用于数据传输还是存储,通过使用Newtonsoft.JsonSystem.Text.Json库,可以方便地实现这一功能,选择哪个库取决于你的项目需求和目标平台,希望本文能帮助你更好地理解和应用这些技术!