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

Azure Durable Functions动态JSON数组传递异常问题求助

问题原因

Azure Durable Functions 默认使用 Newtonsoft.Json 作为跨函数(Activity→Orchestrator)的数据序列化库,但你在Activity中用 System.Text.Json 反序列化得到的 dynamic[] 本质是 JsonElement[] 类型。当这个对象传递到Orchestrator时,Newtonsoft.Json无法正确处理System.Text.Json的原生类型,会将其错误序列化为JToken相关结构,最终导致值丢失、展开对象时抛出InvalidOperationException。

解决方法

方案1:让Durable Functions改用System.Text.Json序列化

修改项目根目录的host.json,配置Durable Functions使用System.Text.Json替代Newtonsoft.Json,确保前后序列化逻辑统一:

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "serializerSettings": {
        "useSystemTextJson": true
      }
    }
  }
}

配置完成后,Activity中用System.Text.Json反序列化的dynamic[](JsonElement数组)能被正确传递到Orchestrator,不会出现类型不兼容问题。

方案2:用强类型/通用类型替代dynamic

如果业务允许,避免使用dynamic,改用object[]或自定义兼容类型接收混合数组:

// 直接用object[]接收API返回的混合数组
var response = await httpClient.GetFromJsonAsync<object[]>(apiUrl);

// 或者定义包含JsonElement数组的类,兼容混合类型
public class JsonTest
{
    public JsonElement[] MixedArray { get; set; }
}
var testObj = await httpClient.GetFromJsonAsync<JsonTest>(apiUrl);

这种方式下,无论是System.Text.Json还是Newtonsoft.Json都能正确处理该类型,跨函数传输不会出错。

方案3:在Activity中转换为Newtonsoft.Json兼容类型

如果无法修改全局序列化配置,可以在Activity中将System.Text.Json的反序列化结果转换为Newtonsoft.Json可识别的类型后再返回:

// 用System.Text.Json反序列化得到JsonElement数组
var jsonElements = await httpClient.GetFromJsonAsync<JsonElement[]>(apiUrl);

// 转换为普通object数组(根据实际类型扩展分支)
var objectArray = jsonElements.Select(e => e.ValueKind switch
{
    JsonValueKind.String => e.GetString(),
    JsonValueKind.Number => e.GetInt32(),
    JsonValueKind.Boolean => e.GetBoolean(),
    _ => e.ToString()
}).ToArray();

// 返回转换后的对象给Orchestrator
return objectArray;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:50:29