invalid json

invalid json 请求接口的时候报错invalid json

Error parsing Infinity value. Path

双引号和换行导致 JSON 格式错误,特别是岗位描述中包含 "换行符\ 等字符时,直接拼接成 JSON 字符串会出错。

var des = $"根据我的简历分析是否应该投递该岗位,只需要回答是或者否,然后给出20字以内的理由 回答格式【是,原因:不符合简历技能】,我的简历信息是{aipromot}岗位描述是{postDescription}";
 var client = new RestClient("api.binjie.fun/api/generateStream?refer__1360=eqfx9iqDu70QGkDlEmqYGKDtK%3DKqYwrIIpD");
 client.Timeout = -1;
 var request = new RestRequest(Method.POST);
 request.AddHeader("accept", "application/json, text/plain, */*");
 request.AddHeader("accept-language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6");
 request.AddHeader("cache-control", "no-cache");
 request.AddHeader("content-type", "application/json");
 request.AddHeader("origin", "https://chat18.aichatos58.com");
 request.AddHeader("pragma", "no-cache");
 request.AddHeader("priority", "u=1, i");
 request.AddHeader("referer", "https://chat18.aichatos58.com/");
 request.AddHeader("sec-ch-ua", "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"");
 request.AddHeader("sec-ch-ua-mobile", "?0");
 request.AddHeader("sec-ch-ua-platform", "\"Windows\"");
 request.AddHeader("sec-fetch-dest", "empty");
 request.AddHeader("sec-fetch-mode", "cors");
 request.AddHeader("sec-fetch-site", "cross-site");
 client.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0";
 request.AddHeader("Cookie", "acw_tc=7754489517486843375693740efbce2738a52db03adbe8d8a2ae052f09; cdn_sec_tc=7754489517486843375693740efbce2738a52db03adbe8d8a2ae052f09"); 
 var body = string.Format(
     "{{\"prompt\":\"{0}\",\"userId\":\"#/chat/1748682523477\",\"network\":true,\"system\":\"\",\"withoutContext\":false,\"stream\":false}}",
     des
 );
 request.AddParameter("application/json", body, ParameterType.RequestBody);
 IRestResponse response = client.Execute(request);
 //Console.WriteLine(response.Content);
 var json = JObject.Parse(response.Content);
 return json; 一直报错prompt的json不对 双引号可能会导致换行出问题,是不是应该用三引号

原因

JSON 中包含了 非法的 JSON 值

没有正确转义的字符串(特别是嵌套 JSON)

确保 prompt 是纯文本,不是 JSON 字符串

是的,当 JSON 数据中包含换行符或特殊字符时,直接使用字符串拼接容易导致格式错误。以下是修复后的代码,使用 JObject 构建 JSON 请求体,避免手动拼接字符串的问题:

修复后的代码(推荐方案)

public JObject GetAiJudgment(string aipromot, string postDescription)
{
    var client = new RestClient("https://api.binjie.fun/api/generateStream?refer__1360=eqfx9iqDu70QGkDlEmqYGKDtK%3DKqYwrIIpD");
    client.Timeout = -1;
    
    var request = new RestRequest(Method.POST);
    
    // 设置请求头
    request.AddHeader("accept", "application/json");
    request.AddHeader("content-type", "application/json");
    request.AddHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");

    // 使用 JObject 构建请求体(避免手动拼接 JSON)
    var prompt = $"根据我的简历分析是否应该投递该岗位,只需要回答是或者否,然后给出20字以内的理由 回答格式【是,原因:不符合简历技能】,我的简历信息是{aipromot}岗位描述是{postDescription}";
    
    var requestBody = new JObject
    {
        ["prompt"] = prompt,
        ["userId"] = "#/chat/1748682523477",
        ["network"] = true,
        ["system"] = "",
        ["withoutContext"] = false,
        ["stream"] = false
    };

    request.AddJsonBody(requestBody.ToString());

    try
    {
        IRestResponse response = client.Execute(request);
        
        if (!response.IsSuccessful)
        {
            throw new Exception($"API请求失败: {response.StatusCode}");
        }

        return JObject.Parse(response.Content);
    }
    catch (Exception ex)
    {
        return new JObject
        {
            ["error"] = ex.Message
        };
    }
}

关键改进点:

  1. 安全的 JSON 构建方式

    • 使用 JObject 代替字符串拼接
    • 自动处理特殊字符和换行符
  2. 简化请求头

    • 移除非必要的请求头
    • 保留核心的 content-typeuser-agent
  3. 错误处理

    • 添加 try-catch 捕获异常
    • 返回包含错误信息的 JSON
  4. 使用方法

var result = GetAiJudgment("3年C#经验", "需要.NET开发工程师");
if (!result.ContainsKey("error"))
{
    Console.WriteLine(result["response"]?.ToString());
}

替代方案(如果必须使用字符串)

如果因某些原因必须使用字符串拼接,可以使用 @ 原样字符串配合 JsonConvert

var rawJson = @"
{
    ""prompt"": """ + prompt.Replace("\"", "\\\"") + @""",
    ""userId"": ""#/chat/1748682523477"",
    ""network"": true,
    ""system"": """",
    ""withoutContext"": false,
    ""stream"": false
}";

request.AddParameter("application/json", rawJson, ParameterType.RequestBody);

常见问题排查

  1. 提示词中的双引号问题

    • 如果 aipromotpostDescription 可能包含双引号,需要转义:
    var prompt = $"我的简历信息是{aipromot.Replace("\"", "\\\"")}";
    
  2. 换行符问题

    • 在 JSON 中换行符应表示为 \n
    prompt = prompt.Replace("\r\n", "\\n");
    
  3. 调试建议

    Console.WriteLine(requestBody.ToString());
    // 检查输出的JSON格式是否正确
    

这种实现方式更健壮,能有效避免 JSON 格式错误问题。