NewtonSoft JSON反序列化后仍为序列化数据问题及REST API响应处理
解决Newtonsoft.Json反序列化异常与转义API响应问题
为啥会出现这种情况?
你碰到的是个典型的双重序列化JSON问题:API返回的响应其实是把原本的JSON数组,又转成了带转义符(\")的字符串格式。直接用JsonConvert.DeserializeObject<T>去解析的话,只会把外层的字符串转成string类型,自然看起来还处于“序列化状态”。
一步步解决问题
1. 先处理转义字符串,再反序列化
咱们有两种简单的方式把带转义的字符串转成真正的对象列表:
方式一:两次反序列化(最直观)
先把整个响应字符串反序列化为普通字符串(这一步会自动处理掉所有转义符),再把这个干净的字符串反序列化为你的实体集合:
// 假设apiResponse是你从API拿到的带转义的原始响应 string cleanedJson = JsonConvert.DeserializeObject<string>(apiResponse); List<EmployeePassport> employeeList = JsonConvert.DeserializeObject<List<EmployeePassport>>(cleanedJson);
方式二:用JToken直接解析(少一次反序列化)
如果不想做两次反序列化,也可以用Newtonsoft的JToken来直接解析原始字符串,再转成目标类型:
JToken parsedToken = JToken.Parse(apiResponse); List<EmployeePassport> employeeList = parsedToken.ToObject<List<EmployeePassport>>();
2. 定义匹配的实体类
要正确反序列化,你得先写一个和JSON字段对应的实体类,比如:
public class EmployeePassport { [JsonProperty("passport_expiration")] public DateTime PassportExpiration { get; set; } [JsonProperty("first_name")] public string FirstName { get; set; } [JsonProperty("last_name")] public string LastName { get; set; } [JsonProperty("cass_status")] public string CassStatus { get; set; } [JsonProperty("notes")] public string Notes { get; set; } [JsonProperty("kcm_status")] public string KcmStatus { get; set; } [JsonProperty("employment_type")] public string EmploymentType { get; set; } [JsonProperty("employee_id")] public string EmployeeId { get; set; } [JsonProperty("passport_id")] public string PassportId { get; set; } }
这里用JsonProperty特性来映射JSON里的下划线命名和C#的驼峰命名,避免反序列化失败。
3. 调试与避坑技巧
- 先验证JSON格式:可以把
cleanedJson输出到控制台或日志,看看是不是标准的JSON数组,确保转义符已经被完全处理。 - 处理日期格式问题:如果反序列化日期时出错,可以自定义序列化设置:
var settings = new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.IsoDateFormat, DateTimeZoneHandling = DateTimeZoneHandling.Utc // 根据你的业务需求调整 }; List<EmployeePassport> employeeList = JsonConvert.DeserializeObject<List<EmployeePassport>>(cleanedJson, settings);
- 检查响应完整性:你提供的例子里响应最后是
APPROVE...,如果是截断的话,得先确保拿到完整的API响应,否则反序列化肯定会报错。
额外建议
如果经常遇到这种问题,可以检查下API的响应头——正常的JSON响应应该返回Content-Type: application/json。如果API返回的是text/plain,可能会导致客户端收到带转义的字符串,这时候可以联系API开发者修复响应格式。
内容的提问来源于stack exchange,提问作者KWallace
相关产品推荐
相关产品推荐

