C#使用RestSharp时如何正确序列化JSON为字符串发起POST请求
问题根源
你C#版本调用失败的核心原因是AddBody方法的默认序列化逻辑:当你传入手动拼接好的JSON字符串时,RestSharp会把这个字符串当成普通的CLR对象再次执行JSON序列化,最终发出去的请求体是带转义、被外层引号包裹的字符串,根本不是Python中json.dumps生成的原生JSON数组,和服务端预期的负载格式完全不匹配。
推荐实现方案
和Pythonjson.dumps效果完全一致的最简洁写法有两种,优先选第一种:
方案1:结构化对象自动序列化(官方推荐,零转义错误)
和Python里先构造list/dict结构化数据再序列化的逻辑完全一致,不需要手动拼JSON字符串,RestSharp会自动完成序列化,输出格式和json.dumps结果完全对齐:
var client = new RestClient(someUrl); var request = new RestRequest(Method.Post); // 配置Cookie、请求头 request.AddCookie("cookie", theCookies); request.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0"); request.AddHeader("Accept", "application/json, text/plain, */*"); request.AddHeader("Accept-Language", "en-US,en;q=0.5"); request.AddHeader("Accept-Encoding", "gzip, deflate, br"); // 构造和Python端完全一致的结构化数据,不用管转义 var requestPayload = new List<object> { new { parameterName = "date", values = new [] { "-30d" } }, new { parameterName = "category", values = new [] { "25", "4", "2" } }, new { parameterName = "format", values = new [] { "pdf" } }, new { parameterName = "readunread", values = new [] { "read" } } }; // 自动按JSON格式序列化负载,等价于Python的json.dumps(data) request.AddJsonBody(requestPayload); var response = client.Execute(request);
注意:
AddJsonBody会自动添加Content-Type: application/json请求头,不需要手动重复添加;另外不要手动设置Host头,RestSharp会根据目标地址自动填充,手动赋值反而可能触发校验错误。
方案2:直接传入预序列化的JSON字符串
如果你已经提前拿到了序列化完成的JSON字符串,不想再构造对象,就用AddStringBody替代AddBody,明确指定内容格式,避免二次序列化:
string preSerializedJson = "[{\"parameterName\":\"category\",\"values\":[\"25\",\"4\",\"2\"]},{\"parameterName\":\"format\",\"values\":[\"pdf\"]},{\"parameterName\":\"date\",\"values\":[\"-30d\"]},{\"parameterName\":\"readunread\",\"values\":[\"read\"]}]"; // 直接发送原始JSON字符串,不做额外序列化处理 request.AddStringBody(preSerializedJson, DataFormat.Json);
这种写法发出去的请求体和Python端json.dumps生成的字符串完全一致,不会做任何额外转义或包装。
内容的提问来源于stack exchange,提问作者Singularity20XX
相关产品推荐
相关产品推荐

