基于Monaco Editor的C#动态编译JSON反序列化报错求助
解决动态编译C#代码中System.Text.Json反序列化“JSON值无法转换”异常
核心问题根源:你注释掉
System.Text.Json.Serialization.dll是导致异常的关键原因。System.Text.Json的核心序列化/反序列化逻辑(包括属性映射、复杂类型处理、特性识别等)高度依赖该程序集,缺失它会让Json序列化器无法正确解析自定义对象的结构。具体解决步骤:
- 恢复引入
System.Text.Json.Serialization.dll
在构建CSharpCompilation时,必须将该程序集添加到引用集合中,与System.Text.Json.dll一同引入。确保两个dll的本地路径正确,且被编译过程正确加载。 - 确保代码中正确使用Json序列化特性
如果你的自定义对象需要自定义属性名称、忽略某些属性等,必须在对象属性上标记[JsonPropertyName]、[JsonIgnore]等特性——这些特性都属于System.Text.Json.Serialization命名空间,缺失对应dll时这些特性无法被识别,会导致序列化器无法匹配JSON字段与对象属性,进而抛出转换异常。 - 验证程序集版本一致性
确认System.Text.Json.dll和System.Text.Json.Serialization.dll的版本完全一致,版本不匹配会导致序列化逻辑内部调用出错,同样可能引发转换异常。 - 检查动态编译程序集的正确性
编译完成后,可以临时将生成的程序集保存到本地,用反编译工具查看:- 自定义对象的定义是否正确生成
- 程序集是否正确引用了
System.Text.Json和System.Text.Json.Serialization
- 捕获详细异常信息定位问题
不要只捕获顶层异常,要获取InnerException的具体内容,明确是哪个字段、哪种类型无法转换。比如Nullable类型、枚举类型、嵌套对象的转换问题,可能需要额外配置JsonSerializerOptions(如设置PropertyNameCaseInsensitive = true)或添加对应特性标记。
- 恢复引入
内容的提问来源于stack exchange,提问作者Shankar Kumar
相关产品推荐
相关产品推荐

