使用Json.NET反序列化时解析Version类型报错的解决方法
解决Json.NET反序列化Version类型属性的错误
问题根源
Json.NET默认会将System.Version类型序列化为版本格式字符串(例如"320.0.0.0"),但你的JSON中Version字段被序列化成了包含Major/Minor等属性的对象结构。反序列化时,Json.NET的默认解析器期望读取字符串而非对象,因此抛出JsonSerializationException。
解决方案(无需自定义序列化器)
方案1:重新生成符合默认规则的JSON
如果可以重新生成JSON数据,修改序列化逻辑,让Version以字符串形式输出。可以显式指定使用Json.NET内置的VersionConverter:
var settings = new JsonSerializerSettings(); settings.Converters.Add(new VersionConverter()); // 序列化时使用该设置 string json = JsonConvert.SerializeObject(yourReleaseManifest, settings);
生成后的JSON中Version会变成类似"320.0.0.0"的字符串,此时直接反序列化即可正常解析。
方案2:通过辅助类中转适配现有JSON
如果无法修改现有JSON,可利用Json.NET的序列化生命周期特性,添加一个辅助DTO类来中转数据,无需编写自定义转换器:
修改Release类如下:
public class Release { public string Id { get; set; } public string Description { get; set; } public string InformativeVersion { get; set; } public DateTime InformativeReleaseDate { get; set; } public string BinaryUrl { get; set; } public string BinarySha256 { get; set; } // 用于接收JSON中的Version对象 [JsonProperty("Version")] private VersionDto _versionDto { get; set; } // 对外暴露的Version属性 [JsonIgnore] public Version Version { get; set; } // 反序列化完成后,将DTO转换为Version [OnDeserialized] private void OnDeserialized(StreamingContext context) { if (_versionDto == null) return; // 兼容Version不允许Revision为-1的规则 var revision = _versionDto.Revision >= 0 ? _versionDto.Revision : 0; var build = _versionDto.Build >= 0 ? _versionDto.Build : 0; Version = new Version(_versionDto.Major, _versionDto.Minor, build, revision); } // 如果需要序列化,添加此方法将Version转换回DTO [OnSerializing] private void OnSerializing(StreamingContext context) { if (Version == null) return; _versionDto = new VersionDto { Major = Version.Major, Minor = Version.Minor, Build = Version.Build, Revision = Version.Revision, MajorRevision = Version.MajorRevision, MinorRevision = Version.MinorRevision }; } // 匹配JSON结构的辅助DTO private class VersionDto { public int Major { get; set; } public int Minor { get; set; } public int Build { get; set; } public int Revision { get; set; } public int MajorRevision { get; set; } public int MinorRevision { get; set; } } }
这个方法通过[JsonProperty]将JSON中的Version对象绑定到私有DTO,再利用[OnDeserialized]钩子完成类型转换,完全借助Json.NET内置特性实现,无需编写独立的自定义序列化器。
内容的提问来源于stack exchange,提问作者codejockie
相关产品推荐
相关产品推荐

