.NET 6中System.Text.Json序列化嵌套动态对象遇无效参数错误
在VS 2022、C#、.NET 6 Core环境下处理大量媒体文件时,将文件属性转换为dynamic对象进行处理。由于不同音视频文件的参数类型、数量差异大,用POCO类适配不现实,且这些动态对象已经在系统各模块广泛使用,无法替换。处理完媒体文件并给对象添加额外信息后,尝试用System.Text.Json序列化对象时遇到了无效参数错误。原代码误写为Deserialize已修正为Serialize,但就算序列化刚序列化过的未修改对象,依然报错。之前在.NET Framework中用Newtonsoft可以正常实现,现在希望在Core环境下摆脱Newtonsoft解决这个问题。
代码示例:
public static string ObjectToString(dynamic o) { return System.Text.Json.JsonSerializer.Serialize<dynamic>(o); // 原错误为Deserialize,已修正 }
报错信息:
System.Text.Json.JsonSerializer.Deserialize<object>(System.Text.Json.JsonDocument, System.Text.Json.JsonSerializerOptions)' has some invalid arguments'
不要显式指定
<dynamic>泛型参数System.Text.Json处理dynamic时,显式声明泛型参数会触发异常逻辑。直接调用无泛型参数的Serialize方法即可,因为dynamic编译时本质会被当作object处理,显式指定反而会让序列化器错误解析类型:public static string ObjectToString(dynamic o) { return System.Text.Json.JsonSerializer.Serialize(o); }配置序列化选项适配动态对象
如果动态对象包含字段、非标准属性,或者需要大小写不敏感的解析,可以通过JsonSerializerOptions配置:public static string ObjectToString(dynamic o) { var options = new JsonSerializerOptions { IncludeFields = true, // 动态对象含字段时必须开启 PropertyNameCaseInsensitive = true, WriteIndented = true // 可选,格式化输出JSON }; return System.Text.Json.JsonSerializer.Serialize(o, options); }确认动态对象的实际类型
如果用的是ExpandoObject(最常用的动态对象实现),直接序列化就没问题;如果是自定义动态类型,确保它实现了IDictionary<string, object>接口,System.Text.Json对这类类型的序列化支持更稳定:// 示例:序列化ExpandoObject dynamic mediaInfo = new ExpandoObject(); mediaInfo.FilePath = "D:\\media\\audio.mp3"; mediaInfo.BitRate = 320; string json = System.Text.Json.JsonSerializer.Serialize(mediaInfo);排查报错的真正来源
你给出的报错信息指向Deserialize方法,但代码已经修正为Serialize,要检查系统其他地方是不是还有误调用Deserialize的情况(比如把JsonDocument当成字符串传入)。如果是序列化时的错误,捕获JsonException查看详细信息,能快速定位到有问题的属性或类型:public static string ObjectToString(dynamic o) { try { return System.Text.Json.JsonSerializer.Serialize(o); } catch (JsonException ex) { // 打印详细错误信息 Console.WriteLine($"序列化失败:{ex.Message}"); throw; } }
内容的提问来源于stack exchange,提问作者Velocedge

