如何在C#中解析键动态变化的JSON错误响应?
当然可以!这种键不固定的错误结构,用字典来对应简直是完美的选择,我给你两种最常用的C# JSON处理方案,都是直接就能用的:
使用System.Text.Json(.NET Core/.NET 5+ 内置)
首先我们定义一个匹配JSON结构的模型类,用Dictionary<string, List<string>>来接收那些键不固定的错误项:
public class ErrorResponse { [JsonPropertyName("errors")] public Dictionary<string, List<string>> Errors { get; set; } }
然后就能直接反序列化并处理错误了:
// 示例JSON字符串,包含多个错误 string jsonResponse = "{ \"errors\": { \"title\": [\"can't be blank\"], \"inventory_policy\": [\"is not included in the list\"] } }"; // 反序列化 var errorResult = JsonSerializer.Deserialize<ErrorResponse>(jsonResponse); // 遍历所有错误 if (errorResult?.Errors != null) { foreach (var errorEntry in errorResult.Errors) { Console.WriteLine($"出错字段: {errorEntry.Key}"); foreach (var errorMsg in errorEntry.Value) { Console.WriteLine($"错误信息: {errorMsg}"); } } }
使用Newtonsoft.Json(Json.NET)
如果你还在使用旧版.NET Framework,或者更习惯用Json.NET,写法也类似:
先定义模型类:
public class ErrorResponse { [JsonProperty("errors")] public Dictionary<string, List<string>> Errors { get; set; } }
然后反序列化并处理:
string jsonResponse = "{ \"errors\": { \"title\": [\"can't be blank\"], \"inventory_policy\": [\"is not included in the list\"] } }"; // 反序列化 var errorResult = JsonConvert.DeserializeObject<ErrorResponse>(jsonResponse); // 遍历错误的逻辑和上面完全一致 if (errorResult?.Errors != null) { foreach (var errorEntry in errorResult.Errors) { Console.WriteLine($"出错字段: {errorEntry.Key}"); foreach (var errorMsg in errorEntry.Value) { Console.WriteLine($"错误信息: {errorMsg}"); } } }
额外小技巧:不用定义模型类直接解析
如果你不想专门写一个ErrorResponse类,也可以直接把JSON反序列化为嵌套字典:
// System.Text.Json版本 var rawErrors = JsonSerializer.Deserialize<Dictionary<string, Dictionary<string, List<string>>>>(jsonResponse); var errors = rawErrors["errors"]; // Json.NET版本 var rawErrors = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, List<string>>>>(jsonResponse); var errors = rawErrors["errors"];
这种方式的核心逻辑是:JSON里的errors对象正好对应C#的Dictionary<string, List<string>>——每个键是出错的字段名,值是该字段对应的错误信息列表,不管字段名是什么,都能被正确解析出来。
内容的提问来源于stack exchange,提问作者xMetalDetectorx
相关产品推荐
相关产品推荐

