.NET Core 1.0中不使用序列化将JSON转为自定义对象的方法
解决.NET Core 1.0中JSON转自定义对象的序列化依赖问题
针对你遇到的问题——因为引用了带[Serialize]特性(推测是DataContract相关特性的笔误)的.NET Framework 4.5 DLL,在.NET Core 1.0中使用Json.NET反序列化时找不到System.Runtime.Serialization程序集,这里有几个可行的解决方案,不需要修改原有DLL:
方案1:安装缺失的序列化依赖包
.NET Core 1.0默认没有包含完整的System.Runtime.Serialization组件,但可以通过NuGet安装兼容的基础包来补全依赖:
- 打开NuGet包管理器,安装
System.Runtime.Serialization.Primitives的4.3.0版本(该版本适配.NET Core 1.0) - 或者在Package Manager Console执行命令:
Install-Package System.Runtime.Serialization.Primitives -Version 4.3.0
这个方案最省心,安装后Json.NET应该能正常加载所需的序列化相关类型,和你在.NET Core 2.0中的表现一致。
方案2:配置Json.NET忽略DataContract特性
如果安装依赖包后还是有问题,可以让Json.NET忽略模型上的序列化特性,改用默认的公共属性序列化规则,这样就能绕过对System.Runtime.Serialization的依赖:
public CustomObject ConvertToObject(string jsonString) { var settings = new JsonSerializerSettings { // 使用默认契约解析器,不考虑DataContract/DataMember特性 ContractResolver = new DefaultContractResolver() }; return JsonConvert.DeserializeObject<CustomObject>(jsonString, settings); }
注意:如果原模型是通过[DataMember]指定要序列化的属性,这个方案会序列化所有公共属性,需要确保JSON字段和对象的公共属性名对应一致。
方案3:手动解析JSON并映射对象(完全绕开序列化)
如果上面两个方案都不适用,你可以完全跳过序列化过程,手动解析JSON并给对象赋值:
using Newtonsoft.Json.Linq; public CustomObject ConvertToObject(string jsonString) { var jsonObj = JObject.Parse(jsonString); var customObj = new CustomObject(); // 逐个映射属性,根据实际属性类型调整 customObj.Id = jsonObj["Id"]?.Value<int>() ?? 0; customObj.Name = jsonObj["Name"]?.ToString(); customObj.CreatedDate = jsonObj["CreatedDate"]?.Value<DateTime>(); return customObj; }
这个方法完全不依赖任何序列化特性,也不会触发对System.Runtime.Serialization的加载,缺点是如果对象属性较多,需要写较多的映射代码,但胜在稳定可控。
内容的提问来源于stack exchange,提问作者MANOJ GOPI
相关产品推荐
相关产品推荐

