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

调用D365 Online OData自定义Action时JSON序列化报错

解决OData调用自定义Action时的400错误

问题背景

自定义Action的输入参数paramsInput为string类型,期望传入序列化后的JSON字符串,在Action内部反序列化为具体类使用。但通过通用OData调用函数CallMessage发起请求时,返回Bad Request 400错误,响应信息如下:

Microsoft.OData.ODataException: An unexpected 'StartObject' node was found for property named 'paramsInput' when reading from the JSON reader. A 'PrimitiveValue' node was expected.

当前参数构建方式是直接将JObject对象赋值给paramsInput,示例结构:

{
    "paramsInput" : {
            "id" : "xxxx-xxxx...",
            "code" : 1
    }
}

原因分析

Action定义的paramsInput是string原始类型,OData期望接收的是原始值(PrimitiveValue),但当前传入的是JSON对象(StartObject),类型不匹配导致解析报错。

解决方案

由于不能修改通用的CallMessage函数结构,需要调整参数构建逻辑:先将业务参数对象序列化为JSON字符串,再将该字符串作为paramsInput的值传入。

修改后的参数构建代码

Guid guid = Guid.NewGuid();
JObject parameters = new JObject();
parameters.Add("id", guid);
parameters.Add("code", 1);

// 将业务参数对象序列化为JSON字符串
string paramsJsonString = JsonConvert.SerializeObject(parameters);

JObject wrapper = new JObject();
// 传入字符串类型的JSON,而非对象
wrapper.Add("paramsInput", paramsJsonString);

// 将wrapper传入CallMessage函数

调整后的请求JSON结构

此时CallMessage序列化后生成的请求内容为:

{
    "paramsInput": "{\"id\":\"xxxx-xxxx...\",\"code\":1}"
}

这样OData会将paramsInput识别为string类型的原始值,符合Action的参数定义要求。Action内部可以正常读取该字符串,并反序列化为InputParams类进行后续逻辑处理。

内容的提问来源于stack exchange,提问作者Jadenkun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:05:27