无法将包含JSON内容的字符串反序列化为C#对象求助
解决双重序列化JSON的反序列化问题
我刚碰到过完全一样的坑!你拿到的响应字符串明显是双重序列化的结果——简单说就是后端API先把对象序列成了JSON字符串,然后又把这个字符串再序列化了一遍,导致出现了一堆额外的转义符(比如\\\"这种),直接反序列化肯定会失败。
给你两种靠谱的解决办法,按需选择:
方法1:手动清理转义字符串
先把外层的包裹引号去掉,再把转义的双引号还原成普通双引号,得到正常的JSON后再反序列化:
// 原始响应内容 var contents = await response.Content.ReadAsStringAsync(); // 第一步:去掉前后的双引号(注意是字符串首尾的",不是转义的\") var cleanedJson = contents.Trim('"'); // 第二步:把转义的\"替换成" cleanedJson = cleanedJson.Replace("\\\"", "\""); // 现在可以正常反序列化了(用Newtonsoft.Json) var paymentResult = JsonConvert.DeserializeObject<YourPaymentModel>(cleanedJson); // 如果用System.Text.Json的话: // var paymentResult = System.Text.Json.JsonSerializer.Deserialize<YourPaymentModel>(cleanedJson);
方法2:先反序列化为字符串,再反序列化为目标对象
这种方法更稳妥,尤其是当转义情况更复杂的时候(比如嵌套的转义):
var contents = await response.Content.ReadAsStringAsync(); // 先把整个响应反序列化为一个普通字符串(因为现在的JSON本质上就是一个字符串) var actualJson = JsonConvert.DeserializeObject<string>(contents); // 再把这个字符串反序列化为你的目标对象 var paymentResult = JsonConvert.DeserializeObject<YourPaymentModel>(actualJson); // System.Text.Json版本: // var actualJson = System.Text.Json.JsonSerializer.Deserialize<string>(contents); // var paymentResult = System.Text.Json.JsonSerializer.Deserialize<YourPaymentModel>(actualJson);
额外提醒
如果这是你们自己维护的API,最好找后端同事修复一下——双重序列化是个常见的低级错误,一般是后端代码里重复调用了序列化方法(比如先JsonConvert.SerializeObject,然后在返回的时候框架又自动序列化了一次)。前端先临时处理能解决问题,但根源修复才是长久之计。
内容的提问来源于stack exchange,提问作者Jade Cowan
相关产品推荐
相关产品推荐

