JSON(JavaScript Object Notation)作为轻量级的数据交换格式,在现代软件开发中无处不在。作为C#开发者,掌握高效的JSON序列化与反序列化技术至关重要。本文将系统介绍C#中处理JSON的各种方法,帮助您在不同场景下选择最合适的解决方案。
一、JSON序列化基础概念
1.1 什么是JSON序列化
JSON序列化是指将.NET对象转换为JSON格式字符串的过程,反序列化则是将JSON字符串转换回.NET对象。这种转换使得数据可以在不同系统、平台间轻松传输和共享。
1.2 .NET中的JSON处理库
- System.Text.Json:.NET Core 3.0+内置库,高性能
- Newtonsoft.Json:功能丰富的第三方库
- 其他选择:Jil、Utf8Json等
二、System.Text.Json使用详解
2.1 基本序列化与反序列化
using System.Text.Json;
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
// 序列化
Product product = new Product { Id = 1, Name = "笔记本电脑", Price = 5999.99m };
string json = JsonSerializer.Serialize(product);
// 反序列化
Product deserialized = JsonSerializer.Deserialize<Product>(json);
2.2 配置序列化选项
var options = new JsonSerializerOptions
{
WriteIndented = true, // 美化输出
PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // 驼峰命名
IgnoreNullValues = true, // 忽略null值
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, // 非严格编码
Converters = { new JsonStringEnumConverter() } // 枚举转字符串
};
string json = JsonSerializer.Serialize(product, options);
2.3 处理日期和自定义格式
public class CustomDateTimeConverter : JsonConverter<DateTime>
{
private const string Format = "yyyy-MM-dd HH:mm:ss";
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateTime.ParseExact(reader.GetString(), Format, null);
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString(Format));
}
}
// 使用自定义转换器
options.Converters.Add(new CustomDateTimeConverter());
三、Newtonsoft.Json高级应用
3.1 基本用法
using Newtonsoft.Json;
// 序列化
string json = JsonConvert.SerializeObject(product);
// 反序列化
Product obj = JsonConvert.DeserializeObject<Product>(json);
3.2 高级配置
var settings = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
NullValueHandling = NullValueHandling.Ignore,
ContractResolver = new CamelCasePropertyNamesContractResolver(),
DateFormatString = "yyyy-MM-dd",
Converters = new List<JsonConverter> { new StringEnumConverter() }
};
string json = JsonConvert.SerializeObject(product, settings);
3.3 处理复杂场景
// 忽略属性
[JsonIgnore]
public string InternalCode { get; set; }
// 自定义属性名
[JsonProperty("product_name")]
public string Name { get; set; }
// 处理循环引用
settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
四、性能优化技巧
4.1 使用源生成器(Source Generators)
[JsonSerializable(typeof(Product))]
public partial class ProductJsonContext : JsonSerializerContext {}
// 使用生成的序列化代码
var json = JsonSerializer.Serialize(product, ProductJsonContext.Default.Product);
4.2 流式处理大文件
await using var stream = File.OpenRead("largefile.json");
var products = JsonSerializer.DeserializeAsyncEnumerable<Product>(stream);
await foreach (var item in products)
{
// 处理每个产品
}
4.3 缓存序列化选项
private static readonly JsonSerializerOptions _options = new()
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};
// 复用配置
string json = JsonSerializer.Serialize(data, _options);
五、实际应用场景
5.1 Web API开发
// 在ASP.NET Core中配置JSON选项
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
5.2 配置文件处理
// 读取配置
var config = JsonSerializer.Deserialize<AppConfig>(File.ReadAllText("config.json"));
// 保存配置
File.WriteAllText("config.json",
JsonSerializer.Serialize(config, new JsonSerializerOptions { WriteIndented = true }));
5.3 跨平台数据交换
// 序列化为JSON传输
string payload = JsonSerializer.Serialize(data);
// 接收后反序列化
var receivedData = JsonSerializer.Deserialize<DataModel>(payload);
六、常见问题解决方案
- 处理多态类型:
[JsonDerivedType(typeof(Student), "student")]
[JsonDerivedType(typeof(Teacher), "teacher")]
public class Person { ... }
- 解决大数字精度丢失:
public class LongToStringConverter : JsonConverter<long>
{
public override long ReadJson(...) => long.Parse(reader.Value.ToString());
public override void WriteJson(...) => writer.WriteValue(value.ToString());
}
- 处理特殊字符:
var options = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
};
七、库选择建议
场景 | 推荐库 |
---|---|
新项目,性能敏感 | System.Text.Json |
需要丰富功能 | Newtonsoft.Json |
超大JSON处理 | System.Text.Json流式API |
需要最大兼容性 | Newtonsoft.Json |
结语
JSON序列化是C#开发中的基础但至关重要的技能。通过掌握System.Text.Json和Newtonsoft.Json的使用方法,您将能够:
- 高效处理各种数据交换需求
- 优化应用程序性能
- 解决复杂的序列化场景
- 构建更加健壮的系统
无论您选择哪种库,记住始终考虑:
- 性能需求
- 功能要求
- 团队熟悉度
- 长期维护性
希望本指南能帮助您在C#项目中更加得心应手地处理JSON数据!