将JSON字符串发送至API报错,直接发送.NET对象正常的原因排查
原因分析
这个问题的核心是Flurl的PostJsonAsync方法的设计逻辑:
- 当直接传入
.NET对象时,PostJsonAsync会自动用内置序列化器(.NET Framework下默认是Newtonsoft.Json)把对象序列化为标准JSON字符串,同时设置正确的Content-Type: application/json请求头,API能正常解析为对应的数据模型。 - 但如果先把对象序列化为JSON字符串再传给
PostJsonAsync,这个方法会把这个字符串当作普通.NET对象再次序列化。比如原本的{"Name":"Test"}会被转义成"{\"Name\":\"Test\"}",API接收到的是一个字符串而非预期的JSON对象,解析时找不到对应属性,自然抛出空引用异常。
排查与解决方法
- 抓包对比请求体:用Fiddler或Visual Studio的网络调试工具,分别捕获两种请求的请求体。直接传对象的请求体是标准JSON结构,传预序列化字符串的请求体是带转义的字符串,一眼就能定位问题。
- 使用正确的Flurl方法发送预序列化JSON:如果一定要提前序列化JSON,别用
PostJsonAsync,改用PostStringAsync并手动设置Content-Type:var jsonStr = JsonConvert.SerializeObject(dataToSend); await "https://your-api-url".PostStringAsync(jsonStr) .WithHeader("Content-Type", "application/json"); - 验证API接收模型:确认API端的接收参数是对应的数据类,而非字符串类型。如果API期望接收对象,却收到了字符串,反序列化时会得到null或无法匹配属性,触发空引用。
- Postman复现验证:分别用标准JSON对象和转义后的JSON字符串在Postman中发送请求,看API的响应结果,确认是请求格式导致的问题。
内容的提问来源于stack exchange,提问作者Javier Cintrón
相关产品推荐
相关产品推荐

