调用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
相关产品推荐
相关产品推荐

