C#如何处理JSON数组_C#将List集合序列化为字符串的方法【实战】

裘德小鎮的故事

裘德小鎮的故事

2026-04-23

509人浏览

原创

jsonserializer.serialize 可直接序列化泛型 list 为标准 json 数组,如 list 输出 [1,2,3];需确保类型明确、避免非泛型集合或匿名包装,反序列化时须显式指定 list 类型。

c#如何处理json数组_c#将list集合序列化为字符串的方法【实战】

JsonSerializer.Serialize 直接序列化 List<t></t>

只要目标类型是明确的泛型集合(比如 List<string></string>List<person></person>),System.Text.JsonJsonSerializer.Serialize 就能直接输出标准 JSON 数组字符串。它默认行为就是把 List 映射为 JSON array,无需额外配置。

常见错误是传入非泛型 ArrayList 或未指定泛型参数的 IEnumerable,这时会抛出 NotSupportedException 或输出空对象 {}

  • 确保集合类型是泛型,如 List<int></int>Dictionary<string object></string>
  • 若元素类型含复杂嵌套或自定义属性,需确认类有 public getter,或手动加 [JsonPropertyName] 标记
  • 不推荐对 object[] 直接序列化——类型擦除后可能丢失结构,应显式转为 List<t></t>
var numbers = new List<int> { 1, 2, 3 };
string json = JsonSerializer.Serialize(numbers); // 输出: [1,2,3]
</int>

遇到 JsonSerializerOptions 配置项选哪个?

多数场景默认选项就够用,但三个常用配置项直接影响数组序列化结果:是否缩进、日期格式、忽略 null 值。它们不改变数组结构本身,但会影响可读性与兼容性。

  • WriteIndented = true:让输出带换行缩进,方便调试;生产环境建议关掉(体积增大、解析稍慢)
  • DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull:若列表元素是 class,且某些字段为 null,该配置会让整个字段不出现在 JSON 中
  • Converters.Add(new JsonStringEnumConverter()):当 List<myenum></myenum> 序列化时,避免输出数字而输出枚举名字符串
var options = new JsonSerializerOptions
{
    WriteIndented = false,
    DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
};
string json = JsonSerializer.Serialize(persons, options);

为什么有时得到的是对象而不是数组?

最常见原因是误把 List<t></t> 包在另一个对象里再序列化,比如 JsonSerializer.Serialize(new { data = myList }),结果是 {"data":[...]} —— 这不是“数组变对象”,而是你主动包了一层。

php版微信js-sdk支付接口类
php版微信js-sdk支付接口类

php版微信js-sdk支付接口类

下载

另一个隐蔽原因是用了 Newtonsoft.Json(即 Json.NET)的老代码,且启用了 TypeNameHandling 或自定义 ContractResolver,可能导致添加 $type 字段或包装成 {"$values":[...]}

  • 检查是否多套了一层匿名对象或 wrapper 类
  • 确认项目没混用 System.Text.JsonNewtonsoft.Json —— 二者不兼容,引用冲突会导致行为异常
  • 若必须用 Newtonsoft,用 JsonConvert.SerializeObject(list) 即可,它对 List 的处理更宽容

反序列化回来还是 List<t></t> 吗?

是,但必须显式指定泛型类型参数,否则会得到 JsonElementobject。不指定类型时 JsonSerializer.Deserialize 无法推断数组元素结构,只能返回基础节点对象。

  • 正确写法:JsonSerializer.Deserialize<list>>(json)</list>
  • 错误写法:JsonSerializer.Deserialize(json) → 返回 JsonElement,需手动遍历
  • 若运行时才知道类型(如插件场景),可用 JsonSerializer.Deserialize(json, typeof(List)),但需配合反射构造泛型类型

注意:如果原始 JSON 是 [{"id":1},{"id":2}],但反序列化目标是 List<string></string>,会直接抛 JsonException,错误信息类似 "Expected start token 'String'..." —— 类型不匹配比数据格式错误更早报错。

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

2023.08.08

528

5

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

2023.08.31

1180

3

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

2024.03.13

556

8

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2024.03.14

1051

11

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2026.02.03

148

18

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

202

20

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

2026.03.11

526

24

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

2026.04.13

138

20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

2936

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 18.8万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.3万人学习