使用Delphi REST AddBody提交JSON时遇JsonConvert反序列化错误
Delphi RESTRequest POST JSON 报错:JsonConvert.deserializeObject() 参数非对象类型
问题分析
你遇到的错误核心是后端JsonConvert.deserializeObject()未收到预期的JSON对象,结合返回的"Not Found"提示,先确认API端点URL是否完整正确;如果URL没问题,大概率是请求Body的格式或Content-Type设置存在问题。
可能的原因与解决方法
1. 先抓包确认实际发送的请求内容
用Fiddler这类工具查看POST请求的Body:
- 如果看到Body是被引号包裹的字符串(比如
"{\"name\":\"my_first_contract.pdf\"}"),说明你的JSON被当成普通字符串传递,而非JSON对象,后端自然无法反序列化为对象。 - 如果Body为空或格式混乱,说明RESTRequest的参数设置有误。
2. 优化TJSONObject写法
传入TJSONObject给AddBody时,必须显式指定Content-Type,避免RESTRequest额外序列化对象:
RESTRequest.AddBody(contract, ctAPPLICATION_JSON);
同时确认contract对象没有多余键值对,结构完全符合后端API要求。
3. 优化JSON字符串写法
使用字符串时,除了指定ctAPPLICATION_JSON,还要加上编码控制参数,防止字符串被URL编码:
contract := '{"name":"my_first_contract.pdf"}'; RESTRequest.AddBody(contract, ctAPPLICATION_JSON, poDoNotEncode);
4. 手动强制设置Content-Type请求头
有时AddBody指定的类型会被其他参数覆盖,直接添加请求头确保类型正确:
RESTRequest.AddParameter('Content-Type', 'application/json', pkHTTPHEADER, poDoNotEncode);
确保请求头里的Content-Type是application/json,而非text/plain或application/x-www-form-urlencoded。
5. 核对后端API的结构要求
部分API要求JSON对象嵌套在特定键下(比如{"data":{"name":"my_first_contract.pdf"}}),仔细查看API文档确认是否需要这种嵌套结构。
总结
优先通过抓包工具确认实际发送的Body内容,再针对性调整Content-Type和编码设置,基本能解决该问题。
内容的提问来源于stack exchange,提问作者Damky
相关产品推荐
相关产品推荐

