C# JSON序列化方法:从基础到高级的全面指南


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);

六、常见问题解决方案

  1. 处理多态类型
   [JsonDerivedType(typeof(Student), "student")]
   [JsonDerivedType(typeof(Teacher), "teacher")]
   public class Person { ... }
  1. 解决大数字精度丢失
   public class LongToStringConverter : JsonConverter<long>
   {
       public override long ReadJson(...) => long.Parse(reader.Value.ToString());
       public override void WriteJson(...) => writer.WriteValue(value.ToString());
   }
  1. 处理特殊字符
   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的使用方法,您将能够:

  1. 高效处理各种数据交换需求
  2. 优化应用程序性能
  3. 解决复杂的序列化场景
  4. 构建更加健壮的系统

无论您选择哪种库,记住始终考虑:

  • 性能需求
  • 功能要求
  • 团队熟悉度
  • 长期维护性

希望本指南能帮助您在C#项目中更加得心应手地处理JSON数据!


发表回复

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