.NET 中组装 JSON 的多种实用方法
在现代软件开发中,JSON(JavaScript Object Notation)已成为数据交换的事实标准。.NET 框架提供了多种强大的工具和方法来组装 JSON 数据,无论是构建简单的结构化数据还是复杂的嵌套对象,开发者都能找到合适的途径,本文将详细介绍在 .NET 中组装 JSON 的几种常用方法,包括传统的 System.Web.Script.Serialization、轻量级的 Newtonsoft.Json(Json.NET)以及 .NET Core/.NET 5+ 中内置的 System.Text.Json。
 使用 System.Text.Json(.NET Core / .NET 5+ 推荐)
System.Text.Json 是 .NET Core 3.0 及以后版本中内置的 JSON 处理库,性能优秀,无需额外安装 NuGet 包(通常情况下),它提供了两种主要的 API 来组装 JSON:模型类序列化和 JsonDocument/Utf8JsonWriter 手动构建。
通过模型类序列化(推荐用于结构化数据)
这是最常用、最简单的方法,适用于你已经有了明确的 C# 模型类的情况。
步骤:
- 定义 C# 模型类:这些类的属性将与 JSON 的键对应。
- 创建模型类实例并设置属性值。
- 使用 JsonSerializer.Serialize()方法将对象序列化为 JSON 字符串。
示例:
using System;
using System.Text.Json;
// 1. 定义模型类
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string City { get; set; }
}
public class Program
{
    public static void Main()
    {
        // 2. 创建实例并赋值
        var person = new Person
        {
            Name = "张三",
            Age = 30,
            City = "北京"
        };
        // 3. 序列化为 JSON 字符串
        string jsonString = JsonSerializer.Serialize(person, new JsonSerializerOptions 
        { 
            WriteIndented = true // 格式化输出,使其更易读
        });
        Console.WriteLine(jsonString);
    }
}
输出:
{
  "Name": "张三",
  "Age": 30,
  "City": "北京"
}
使用 Utf8JsonWriter 手动构建(适用于动态或复杂 JSON)
当你需要动态构建 JSON,或者 JSON 结构非常复杂且不确定时,可以使用 Utf8JsonWriter 进行底层、高效的写入。
示例:
using System;
using System.Text;
using System.Text.Json;
public class Program
{
    public static void Main()
    {
        using var stream = new MemoryStream();
        using var writer = new Utf8JsonWriter(stream);
        // 开始写入 JSON 对象
        writer.WriteStartObject();
        writer.WriteString("name", "李四");
        writer.WriteNumber("age", 25);
        writer.WriteString("city", "上海");
        // 写嵌套对象
        writer.WriteStartObject("address");
        writer.WriteString("street", "南京路");
        writer.WriteString("zipcode", "200000");
        writer.WriteEndObject();
        // 写数组
        writer.WriteStartArray("hobbies");
        writer.WriteStringValue("阅读");
        writer.WriteStringValue("游泳");
        writer.WriteStringValue("编程");
        writer.WriteEndArray();
        writer.WriteEndObject();
        writer.Flush();
        string jsonString = Encoding.UTF8.GetString(stream.ToArray());
        Console.WriteLine(jsonString);
    }
}
输出:
{"name":"李四","age":25,"city":"上海","address":{"street":"南京路","zipcode":"200000"},"hobbies":["阅读","游泳","编程"]}
(加上 WriteIndented = true 的 JsonSerializerOptions 类似格式化输出)
使用 JsonDocument 和 JsonElement 修改现有 JSON
如果你需要基于现有 JSON 进行修改或扩展,可以使用 JsonDocument 解析后,再结合 Utf8JsonWriter 重新组装。
 使用 Newtonsoft.Json (Json.NET)
尽管 System.Text.Json 已成为内置首选,但 Newtonsoft.Json(Json.NET)因其丰富的功能和广泛的社区支持,仍然被许多项目使用,它同样支持模型类序列化和手动构建。
通过模型类序列化
首先需要安装 NuGet 包:Newtonsoft.Json。
示例:
using System;
using Newtonsoft.Json;
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string City { get; set; }
}
public class Program
{
    public static void Main()
    {
        var person = new Person
        {
            Name = "王五",
            Age = 28,
            City = "广州"
        };
        // 使用 JsonConvert.SerializeObject 序列化
        string jsonString = JsonConvert.SerializeObject(person, Formatting.Indented);
        Console.WriteLine(jsonString);
    }
}
使用 JObject 和 JArray 手动构建(Linq to JSON)
Json.NET 提供了 JObject、JArray、JProperty 等类,可以非常方便地动态构建 JSON。
示例:
using System;
using Newtonsoft.Json.Linq;
public class Program
{
    public static void Main()
    {
        var jObject = new JObject();
        jObject.Add("name", "赵六");
        jObject.Add("age", 35);
        var address = new JObject();
        address.Add("street", "中山大道");
        address.Add("city", "深圳");
        jObject.Add("address", address);
        var hobbies = new JArray();
        hobbies.Add("旅行");
        hobbies.Add("摄影");
        jObject.Add("hobbies", hobbies);
        string jsonString = jObject.ToString(Newtonsoft.Json.Formatting.Indented);
        Console.WriteLine(jsonString);
    }
}
输出:
{
  "name": "赵六",
  "age": 35,
  "address": {
    "street": "中山大道",
    "city": "深圳"
  },
  "hobbies": [
    "旅行",
    "摄影"
  ]
}
 使用 System.Web.Script.Serialization (旧版 .NET Framework)
在较旧的 .NET Framework 项目中(尤其是 ASP.NET Web Forms 或旧版 ASP.NET MVC),可能会用到 System.Web.Script.Serialization 命名空间下的 JavaScriptSerializer。
示例:
using System;
using System.Web.Script.Serialization; // 需要引用 System.Web.Extensions
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string City { get; set; }
}
public class Program
{
    public static void Main()
    {
        var person = new Person
        {
            Name = "钱七",
            Age = 40,
            City = "成都"
        };
        var serializer = new JavaScriptSerializer();
        string jsonString = serializer.Serialize(person);
        Console.WriteLine(jsonString);
    }
}
注意: 这种方法功能相对有限,且性能不如 System.Text.Json 和 Newtonsoft.Json,在新项目中不推荐使用。
总结与选择建议
| 方法/库 | 优点 | 缺点 | 适用场景 | 
|---|---|---|---|
| System.Text.Json | 内置、高性能、内存占用低、与 .NET 生态集成好 | API 相对较新,某些高级功能不如 Newtonsoft | .NET Core 3.0+ / .NET 5+ 新项目,推荐首选 | 
| Newtonsoft.Json | 功能强大、文档完善、社区活跃、支持 LINQ to JSON | 需要额外安装 NuGet 包,性能略逊于 STJ | 旧项目、需要特定 Newtonsoft 功能的项目 | 
| System.Web.Script.Serialization | .NET Framework 内置(旧版) | 功能有限、性能一般、已被部分弃用 | 仅限非常旧的 .NET Framework 项目维护 | 
如何选择?
- 新项目 (.NET Core / .NET 5/6/7/8+):优先选择 System.Text.Json,它性能更好,且无需额外依赖。
- 旧项目 (.NET Framework) 或依赖 Newtonsoft.Json 特定功能:继续使用 Newtonsoft.Json。
- 需要动态构建复杂 JSON:System.Text.Json可用Utf8JsonWriter;Newtonsoft.Json可用JObject/JArray,后者通常更简洁直观。
- 有明确的 C# 模型:两种主流库都支持通过模型类序列化,这是最简单直接的方式。
这些方法后,你就可以根据项目需求和上下文灵活选择最适合的方式来组装 JSON 数据了。




 
		 
		 
		 
		
还没有评论,来说两句吧...