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

用 JsonSerializer.Serialize 直接序列化 List<t></t>
只要目标类型是明确的泛型集合(比如 List<string></string>、List<person></person>),System.Text.Json 的 JsonSerializer.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":[...]} —— 这不是“数组变对象”,而是你主动包了一层。
另一个隐蔽原因是用了 Newtonsoft.Json(即 Json.NET)的老代码,且启用了 TypeNameHandling 或自定义 ContractResolver,可能导致添加 $type 字段或包装成 {"$values":[...]}。
- 检查是否多套了一层匿名对象或 wrapper 类
- 确认项目没混用
System.Text.Json和Newtonsoft.Json—— 二者不兼容,引用冲突会导致行为异常 - 若必须用 Newtonsoft,用
JsonConvert.SerializeObject(list)即可,它对List的处理更宽容
反序列化回来还是 List<t></t> 吗?
是,但必须显式指定泛型类型参数,否则会得到 JsonElement 或 object。不指定类型时 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'..." —— 类型不匹配比数据格式错误更早报错。










