使用JObject解析HttpClient错误JSON响应至自定义对象失败
解决HttpClient.PostAsync响应JSON解析为ErrorResponse的序列化错误
问题场景
调用HttpClient.PostAsync接口返回错误JSON响应,尝试将其解析为自定义ErrorResponse对象时抛出序列化异常。
接口返回的JSON响应
{ "ResponseStatus": { "ErrorCode": "RegularExpression", "Message": "'Color' can contain only latin, numeric characters and the symbol #.", "Errors": [ { "ErrorCode": "RegularExpression", "FieldName": "Color", "Message": "'Color' can contain only latin, numeric characters and the symbol #.", "Meta": { "RegularExpression": "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$", "PropertyName": "Color Code", "PropertyValue": "adadad" } } ] } }
自定义错误类定义
public class ErrorResponse { public string ErrorCode { get; set; } public string Message { get; set; } public FieldErrors[] Errors { get; set; } } public class FieldErrors { public string ErrorCode {get; set; } public string FieldName {get; set; } public string Message {get; set; } }
原有解析代码
var respCont = await response.Content.ReadAsAsync<JObject>; var errorResponse = respCont["ResponseStatus"].ToObject<ErrorResponse>();
抛出的错误信息
Newtonsoft.Json.JsonSerializationException: 从'Errors'获取值时出错
解决步骤
1. 修复解析代码的语法错误
原有代码中ReadAsAsync<JObject>缺少调用括号,导致运行时错误,修正后代码:
var respCont = await response.Content.ReadAsAsync<JObject>(); var errorResponse = respCont["ResponseStatus"].ToObject<ErrorResponse>();
2. 处理未知字段(若步骤1无法解决)
JSON响应中每个错误元素包含Meta字段,但自定义FieldErrors类未定义该属性。若Newtonsoft.Json全局配置了MissingMemberHandling.Error,会触发序列化异常。此时可在FieldErrors类添加特性忽略未知属性:
using Newtonsoft.Json; [JsonIgnoreProperties(Unknown = true)] public class FieldErrors { public string ErrorCode {get; set; } public string FieldName {get; set; } public string Message {get; set; } }
3. 验证全局序列化配置(可选)
确保全局序列化配置未强制要求处理未知字段,若存在如下配置需调整为Ignore:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings { MissingMemberHandling = MissingMemberHandling.Ignore };
内容的提问来源于stack exchange,提问作者pikk
相关产品推荐
相关产品推荐

