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
相关产品推荐
相关产品推荐

