You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 07:00:15