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

C#处理VK API不同类型JSON响应的反序列化异常求助

VK API响应处理优化方案

问题原因

你的代码抛出异常的核心原因是:正常响应中的ts字段是字符串类型(例如"209"),但Filed类里将ts定义为int类型,反序列化时系统无法将字符串直接转换为整数,导致报错。而我们的需求是跳过正常响应,仅处理包含failed字段的错误响应,因此无需解析完整的正常响应内容。

优雅解决方案(推荐)

使用JsonDocument做轻量级解析,先判断JSON中是否存在failed字段,仅在存在时才提取错误码,避免解析正常响应时的异常:

using System;
using System.Text.Json;

namespace Brusketta.src.VKModels.Json
{
    internal class FailedJson
    {
        public int Response(string jsonString)
        {
            using var doc = JsonDocument.Parse(jsonString);
            var rootElement = doc.RootElement;
            
            // 检查是否包含"failed"字段,并尝试获取其整数值
            if (rootElement.TryGetProperty("failed", out var failedProperty) && failedProperty.TryGetInt32(out var failedCode))
            {
                // 若需要获取ts,可在此处添加:
                // rootElement.TryGetProperty("ts", out var tsProperty);
                // var ts = tsProperty.GetInt32();
                return failedCode;
            }
            
            // 无failed字段,判定为正常响应,返回0跳过
            return 0;
        }
    }

    // 保留Filed类,若后续需完整处理错误响应结构可复用
    public class Filed
    {
        public int failed { get; set; }
        public int ts { get; set; }
    }
}

备选方案(兼容类型转换)

如果需要兼容更多字段类型差异,可通过自定义JSON转换器让Filed类支持字符串与整数的自动转换,同时开启忽略未知字段的配置,避免正常响应中的多余字段导致反序列化失败:

using System;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace Brusketta.src.VKModels.Json
{
    internal class FailedJson
    {
        public int Response(string jsonString)
        {
            var serializeOptions = new JsonSerializerOptions
            {
                Converters = { new StringToIntConverter() },
                // 忽略JSON中未在Filed类定义的字段
                IgnoreUnknownFields = true
            };
            
            var failedResponse = JsonSerializer.Deserialize<Filed>(jsonString, serializeOptions);
            
            return failedResponse?.failed ?? 0;
        }
    }

    public class Filed
    {
        public int failed { get; set; }
        // 给ts字段添加转换器,支持字符串转整数
        [JsonConverter(typeof(StringToIntConverter))]
        public int ts { get; set; }
    }

    // 自定义转换器:处理字符串类型的整数
    public class StringToIntConverter : JsonConverter<int>
    {
        public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            if (reader.TokenType == JsonTokenType.String)
            {
                if (int.TryParse(reader.GetString(), out int result))
                {
                    return result;
                }
                throw new JsonException("无法将字符串转换为有效整数");
            }
            return reader.GetInt32();
        }

        public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options)
        {
            writer.WriteNumberValue(value);
        }
    }
}

方案对比

  • 推荐方案:性能更优,仅解析必要字段,避免无意义的完整JSON反序列化操作,完全贴合“跳过正常响应”的需求。
  • 备选方案:灵活性更高,可应对更多字段类型不匹配的场景,但会解析整个JSON内容,性能略逊。

内容的提问来源于stack exchange,提问作者bodrovdeni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 14:10:16