C# 语言 JSON 序列化的高级配置

C#阿木 发布于 2025-06-13 8 次阅读


C JSON序列化高级配置:深入探索与最佳实践

在C开发中,JSON(JavaScript Object Notation)序列化是一种常见的需求,它允许我们将对象转换为JSON字符串,或者将JSON字符串反序列化为对象。C提供了多种方式来实现这一功能,包括使用内置的`JsonConvert`类、自定义序列化器以及更高级的配置选项。本文将深入探讨C JSON序列化的高级配置,包括序列化器选择、自定义序列化、循环引用处理、日期格式化等,并提供一些最佳实践。

一、序列化器选择

在C中,主要有两种序列化器:`JsonConvert`和`JsonSerializer`。

1.1 JsonConvert

`JsonConvert`是Json.NET库提供的一个便捷的序列化器,它基于`JsonSerializer`,但提供了更简洁的API。以下是一个使用`JsonConvert`的示例:

csharp
using Newtonsoft.Json;

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

public static void Main()
{
Person person = new Person { Name = "张三", Age = 30 };
string json = JsonConvert.SerializeObject(person);
Console.WriteLine(json);
}

1.2 JsonSerializer

`JsonSerializer`是.NET Core引入的序列化器,它提供了更多的配置选项和更好的性能。以下是一个使用`JsonSerializer`的示例:

csharp
using System.Text.Json;

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

public static void Main()
{
Person person = new Person { Name = "张三", Age = 30 };
byte[] jsonBytes = JsonSerializer.Serialize(person);
string json = System.Text.Encoding.UTF8.GetString(jsonBytes);
Console.WriteLine(json);
}

二、自定义序列化

在某些情况下,你可能需要自定义序列化过程,例如,当你想要控制特定属性或类型的序列化方式时。

2.1 自定义属性序列化

以下是一个自定义属性序列化的示例:

csharp
using System.Text.Json.Serialization;

public class Person
{
[JsonPropertyName("name")]
public string Name { get; set; }

[JsonPropertyName("age")]
public int Age { get; set; }
}

2.2 自定义类型序列化

以下是一个自定义类型序列化的示例:

csharp
using System.Text.Json.Serialization;

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

public JsonSerializerOptions Options { get; set; } = new JsonSerializerOptions
{
Converters = { new CustomConverter() }
};
}

public class CustomConverter : JsonConverter
{
public override bool CanConvert(Type typeToConvert)
{
return typeToConvert == typeof(Person);
}

public override Person Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
// 自定义读取逻辑
return new Person { Name = reader.GetString(), Age = reader.GetInt32() };
}

public override void Write(Utf8JsonWriter writer, Person value, JsonSerializerOptions options)
{
// 自定义写入逻辑
writer.WriteString("name", value.Name);
writer.WriteNumber("age", value.Age);
}
}

三、循环引用处理

在序列化包含循环引用的对象时,默认情况下会抛出异常。你可以通过配置序列化器来处理循环引用。

3.1 使用循环引用处理选项

以下是一个使用循环引用处理选项的示例:

csharp
using System.Text.Json;

public class Person
{
public string Name { get; set; }
public Person Friend { get; set; }
}

public static void Main()
{
Person person = new Person { Name = "张三" };
person.Friend = person;

byte[] jsonBytes = JsonSerializer.Serialize(person, new JsonSerializerOptions
{
ReferenceHandler = ReferenceHandler.Preserve
});
string json = System.Text.Encoding.UTF8.GetString(jsonBytes);
Console.WriteLine(json);
}

3.2 使用循环引用处理策略

以下是一个使用循环引用处理策略的示例:

csharp
using System.Text.Json;

public class Person
{
public string Name { get; set; }
public Person Friend { get; set; }
}

public static void Main()
{
Person person = new Person { Name = "张三" };
person.Friend = person;

byte[] jsonBytes = JsonSerializer.Serialize(person, new JsonSerializerOptions
{
ReferenceHandler = ReferenceHandler.IgnoreCycles
});
string json = System.Text.Encoding.UTF8.GetString(jsonBytes);
Console.WriteLine(json);
}

四、日期格式化

在序列化日期时,你可以自定义日期的格式。

4.1 自定义日期格式

以下是一个自定义日期格式的示例:

csharp
using System.Text.Json;

public class Person
{
public string Name { get; set; }
public DateTime BirthDate { get; set; }
}

public static void Main()
{
Person person = new Person { Name = "张三", BirthDate = new DateTime(1990, 1, 1) };

byte[] jsonBytes = JsonSerializer.Serialize(person, new JsonSerializerOptions
{
DateTimeFormat = new JsonSerializerOptions.DateTimeFormat
{
Format = "yyyy-MM-dd'T'HH:mm:ss"
}
});
string json = System.Text.Encoding.UTF8.GetString(jsonBytes);
Console.WriteLine(json);
}

五、最佳实践

1. 选择合适的序列化器:根据项目需求和性能考虑,选择合适的序列化器。
2. 自定义序列化:对于复杂的对象或类型,考虑自定义序列化过程。
3. 处理循环引用:在可能的情况下,避免循环引用,或者使用合适的策略处理循环引用。
4. 自定义日期格式:根据需要自定义日期格式,以便更好地与前端或其他系统兼容。
5. 测试和验证:在部署前,确保序列化和反序列化过程正确无误。

总结

C JSON序列化提供了丰富的配置选项,可以帮助你更好地控制序列化过程。通过选择合适的序列化器、自定义序列化、处理循环引用和日期格式化,你可以实现高效的JSON序列化。本文深入探讨了C JSON序列化的高级配置,并提供了最佳实践,希望对您的开发工作有所帮助。