如何反序列化含双引号内容字段的WebAPI字符串响应
梳理你的API调用与JSON反序列化代码
先把你给出的代码片段完整格式化出来,方便分析:
//从API获取字符串响应的代码 var client = new WebClient(); client.Credentials = new NetworkCredential(userName, passWord); client.Headers.Add(headerKey, headerValue); client.QueryString.Add("companynumber", companyNumber); var response = client.DownloadString(customerAPI); response = response.Replace("\"", "").Replace("\\", "\""); var results = JsonConvert.DeserializeObject<YourTargetType>(response);
先说说你当前写法的潜在问题
你手动用Replace处理响应字符串的方式非常脆弱——这说明你可能遇到了API返回的JSON存在转义问题,但硬编码替换字符很容易破坏原本合法的JSON结构。比如如果响应里有带转义引号的字符串(比如"description":"He said \"hello\""),你的替换会把它变成"description":"He said hello"",直接导致JSON格式错误,反序列化必然失败。
更可靠的处理方案
1. 先搞清楚API返回的原始格式
先通过调试把response的原始内容打印出来,确认它的真实格式:
- 如果是双重转义的JSON(比如看起来像
"{\"companynumber\":\"123\"}"),那应该用JsonConvert.DeserializeObject<string>(response)先解一层转义,而不是手动替换。 - 如果是标准JSON,那完全不需要任何字符串替换,直接反序列化就行。
2. 替换WebClient为HttpClient(推荐)
WebClient是.NET里比较老旧的类,现在更推荐使用HttpClient——它支持异步操作,性能更好,也更符合现代.NET的编码习惯。给你写个示例:
using System.Net.Http.Headers; using System.Text; using Newtonsoft.Json; // 建议把HttpClient做成单例,不要每次请求都新建 using (var httpClient = new HttpClient()) { // 设置身份验证 var credentials = new NetworkCredential(userName, passWord); var authToken = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{credentials.UserName}:{credentials.Password}")); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authToken); // 添加自定义请求头 httpClient.DefaultRequestHeaders.Add(headerKey, headerValue); // 构造查询参数 var queryParams = new Dictionary<string, string> { { "companynumber", companyNumber } }; var queryString = new FormUrlEncodedContent(queryParams).ReadAsStringAsync().Result; var fullRequestUrl = $"{customerAPI}?{queryString}"; // 获取响应并处理 var rawResponse = await httpClient.GetStringAsync(fullRequestUrl); // 处理双重转义的情况 var cleanedResponse = JsonConvert.DeserializeObject<string>(rawResponse); var results = JsonConvert.DeserializeObject<YourTargetType>(cleanedResponse); // 如果是标准JSON,直接反序列化 // var results = JsonConvert.DeserializeObject<YourTargetType>(rawResponse); }
3. 确保目标类与JSON结构匹配
如果反序列化还是失败,检查你的YourTargetType类的属性是否和JSON的键对应:
- 可以用
[JsonProperty]特性来映射不同的名称,比如JSON里是company_number,类里是CompanyNumber:public class YourTargetType { [JsonProperty("company_number")] public string CompanyNumber { get; set; } // 其他属性按需添加 }
快速排查技巧
如果反序列化报错,把处理后的响应字符串复制到本地的JSON校验工具里(比如Visual Studio的JSON编辑器),看看是不是格式损坏了——大概率是手动替换导致的问题,尽量避免直接操作JSON字符串。
内容的提问来源于stack exchange,提问作者venu
相关产品推荐
相关产品推荐

