You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何反序列化含双引号内容字段的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:25:03