苏国平 發表於 2025-11-2 16:02:38

.NET 对象转Json的几种常见方式

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. 使用 System.Text.Json (推荐,.NET Core 3.0+)</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">基本序列化</a></li><li><a href="#_lab2_0_1">带选项的序列化</a></li></ul><li><a href="#_label1">2. 使用 Newtonsoft.Json (Json.NET)</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_2">Newtonsoft.Json 高级用法</a></li></ul><li><a href="#_label2">3. 处理复杂对象</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_3">包含集合的对象</a></li><li><a href="#_lab2_2_4">匿名对象序列化</a></li></ul><li><a href="#_label3">4. 自定义序列化选项</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_5">System.Text.Json 自定义</a></li><li><a href="#_lab2_3_6">使用特性控制序列化</a></li></ul><li><a href="#_label4">5. 性能优化</a></li><ul class="second_class_ul"><li><a href="#_lab2_4_7">使用源生成器 (System.Text.Json)</a></li></ul><li><a href="#_label5">选择建议</a></li><ul class="second_class_ul"></ul></ul></div><p>在.NET中将对象转换为JSON有多种方法,以下是常用的几种方式:</p>
<p class="maodian"><a name="_label0"></a></p><h2>1. 使用 System.Text.Json (推荐,.NET Core 3.0+)</h2>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>基本序列化</h3>
<div class="jb51code"><pre class="brush:csharp;">using System.Text.Json;

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

// 对象转JSON
var person = new Person { Name = "张三", Age = 25, Email = "zhangsan@example.com" };
string jsonString = JsonSerializer.Serialize(person);
Console.WriteLine(jsonString);
// 输出: {"Name":"张三","Age":25,"Email":"zhangsan@example.com"}
</pre></div>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>带选项的序列化</h3>
<div class="jb51code"><pre class="brush:csharp;">var options = new JsonSerializerOptions
{
    WriteIndented = true, // 格式化输出
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase // 驼峰命名
};

string jsonString = JsonSerializer.Serialize(person, options);
Console.WriteLine(jsonString);
// 输出:
// {
//   "name": "张三",
//   "age": 25,
//   "email": "zhangsan@example.com"
// }
</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>2. 使用 Newtonsoft.Json (Json.NET)</h2>
<p>首先安装 NuGet 包:</p>
<div class="jb51code"><pre class="brush:csharp;">Install-Package Newtonsoft.Json
</pre></div>
<div class="jb51code"><pre class="brush:csharp;">using Newtonsoft.Json;

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

// 基本序列化
var person = new Person { Name = "李四", Age = 30, Email = "lisi@example.com" };
string jsonString = JsonConvert.SerializeObject(person);
Console.WriteLine(jsonString);

// 带格式的序列化
string formattedJson = JsonConvert.SerializeObject(person, Formatting.Indented);
Console.WriteLine(formattedJson);
</pre></div>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>Newtonsoft.Json 高级用法</h3>
<div class="jb51code"><pre class="brush:csharp;">var settings = new JsonSerializerSettings
{
    Formatting = Formatting.Indented,
    NullValueHandling = NullValueHandling.Ignore,
    DateFormatString = "yyyy-MM-dd HH:mm:ss"
};

string jsonString = JsonConvert.SerializeObject(person, settings);
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>3. 处理复杂对象</h2>
<p class="maodian"><a name="_lab2_2_3"></a></p><h3>包含集合的对象</h3>
<div class="jb51code"><pre class="brush:csharp;">public class Department
{
    public string Name { get; set; }
    public List&lt;Person&gt; Employees { get; set; }
}

var department = new Department
{
    Name = "技术部",
    Employees = new List&lt;Person&gt;
    {
      new Person { Name = "王五", Age = 28, Email = "wangwu@example.com" },
      new Person { Name = "赵六", Age = 32, Email = "zhaoliu@example.com" }
    }
};

string jsonString = JsonSerializer.Serialize(department, new JsonSerializerOptions { WriteIndented = true });
Console.WriteLine(jsonString);
</pre></div>
<p class="maodian"><a name="_lab2_2_4"></a></p><h3>匿名对象序列化</h3>
<div class="jb51code"><pre class="brush:csharp;">var anonymousObject = new
{
    Id = 1,
    Description = "测试对象",
    CreateTime = DateTime.Now
};

string jsonString = JsonSerializer.Serialize(anonymousObject);
Console.WriteLine(jsonString);
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>4. 自定义序列化选项</h2>
<p class="maodian"><a name="_lab2_3_5"></a></p><h3>System.Text.Json 自定义</h3>
<div class="jb51code"><pre class="brush:csharp;">var options = new JsonSerializerOptions
{
    WriteIndented = true,
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
    DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull,
    Converters = { new JsonStringEnumConverter() } // 枚举转换为字符串
};

string jsonString = JsonSerializer.Serialize(person, options);
</pre></div>
<p class="maodian"><a name="_lab2_3_6"></a></p><h3>使用特性控制序列化</h3>
<div class="jb51code"><pre class="brush:csharp;">public class Product
{
    // System.Text.Json
    public string Name { get; set; }
   
    // 忽略该属性
    public string InternalCode { get; set; }
   
    // 属性顺序
    public decimal Price { get; set; }
}
</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>5. 性能优化</h2>
<p class="maodian"><a name="_lab2_4_7"></a></p><h3>使用源生成器 (System.Text.Json)</h3>
<div class="jb51code"><pre class="brush:csharp;">

public partial class MyJsonContext : JsonSerializerContext
{
}

// 使用源生成器进行序列化
var person = new Person { Name = "测试", Age = 25 };
string jsonString = JsonSerializer.Serialize(person, MyJsonContext.Default.Person);
</pre></div>
<p class="maodian"><a name="_label5"></a></p><h2>选择建议</h2>
<ul><li><strong>新项目</strong>:推荐使用 <code>System.Text.Json</code>,性能更好,无需额外依赖</li><li><strong>现有项目</strong>:如果已经在使用 Newtonsoft.Json,可以继续使用</li><li><strong>复杂场景</strong>:Newtonsoft.Json 功能更丰富,支持更多复杂场景</li></ul>
<p>两种方法都很常用,根据项目需求和个人偏好选择即可。</p>
頁: [1]
查看完整版本: .NET 对象转Json的几种常见方式