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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:25:12