BotFramework 和 LUIS 出现 JSON 序列化器错误

2023-12-04

StackOverflow 社区!

我有一个聊天机器人,并集成了 LUIS.ai 以使其更加智能。其中一个对话即将与主管(老师)预约 一切都运行良好,代码完全相同。几个小时前,我遇到了一些奇怪的错误。

 Exception: Type 'Newtonsoft.Json.Linq.JArray' in Assembly 'Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' is not marked as serializable.

如何重现错误?

如果用户输入中缺少两个实体(教师和日期),则工作正常,机器人会构建表单,询问缺少的输入并显示建议的会议时间。

如果其中一个实体在输入中丢失,它将构建一个表格并询问丢失的日期或教师实体并显示建议的会议时间。

BUT

如果用户的输入同时包含实体:教师和日期,那么我会收到错误。

这是我的 WebApiConfig 类:

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Json settings
            config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented;
            JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
            {
                ContractResolver = new CamelCasePropertyNamesContractResolver(),
                Formatting = Newtonsoft.Json.Formatting.Indented,
                NullValueHandling = NullValueHandling.Ignore,
            };

            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }

仅当我尝试从用户话语中获取实体(一种builtin.dateTimeV2)时,我才会遇到此错误。

这个异步方法被称为:

    //From the LUIS.AI language model the entities
    private const string EntityMeetingDate = "MeetingDate";
    private const string EntityTeacher = "Teacher";

    [LuisIntent("BookSupervision")]
public async Task BookAppointment(IDialogContext context, IAwaitable<IMessageActivity> activity, LuisResult result)
{
    var message = await activity;
    await context.PostAsync($"I am analysing your message: '{message.Text}'...");

    var meetingsQuery = new MeetingsQuery();

    EntityRecommendation teacherEntityRecommendation;
    EntityRecommendation dateEntityRecommendation;

    if (result.TryFindEntity(EntityTeacher, out teacherEntityRecommendation))
    {
        teacherEntityRecommendation.Type = "Name";
    }
    if (result.TryFindEntity(EntityMeetingDate, out dateEntityRecommendation))
    {
        dateEntityRecommendation.Type = "Date";
    }

    var meetingsFormDialog = new FormDialog<MeetingsQuery>(meetingsQuery, this.BuildMeetingsForm, FormOptions.PromptInStart, result.Entities);
    context.Call(meetingsFormDialog, this.ResumeAfterMeetingsFormDialog);

}

构建表单的其他方法:

 private IForm<MeetingsQuery> BuildMeetingsForm()
{
    OnCompletionAsyncDelegate<MeetingsQuery> processMeetingsSearch = async (context, state) =>
    {
        var message = "Searching for supervision slots";
        if (!string.IsNullOrEmpty(state.Date))
        {
            message += $" at {state.Date}...";
        }
        else if (!string.IsNullOrEmpty(state.Name))
        {
            message += $" with professor {state.Name}...";
        }
        await context.PostAsync(message);
    };

    return new FormBuilder<MeetingsQuery>()
        .Field(nameof(MeetingsQuery.Date), (state) => string.IsNullOrEmpty(state.Date))
        .Field(nameof(MeetingsQuery.Name), (state) => string.IsNullOrEmpty(state.Name))
        .OnCompletion(processMeetingsSearch)
        .Build();
}

private async Task ResumeAfterMeetingsFormDialog(IDialogContext context, IAwaitable<MeetingsQuery> result)
{
try
{
    var searchQuery = await result;

    var meetings = await this.GetMeetingsAsync(searchQuery);

    await context.PostAsync($"I found {meetings.Count()} available slots:");

    var resultMessage = context.MakeMessage();
    resultMessage.AttachmentLayout = AttachmentLayoutTypes.Carousel;
    resultMessage.Attachments = new List<Attachment>();

    foreach (var meeting in meetings)
    {
        HeroCard heroCard = new HeroCard()
        {
            Title = meeting.Teacher,
            Subtitle = meeting.Location,
            Text = meeting.DateTime,
            Images = new List<CardImage>()
            {
                new CardImage() {Url = meeting.Image}
            },
            Buttons = new List<CardAction>()
            {
                new CardAction()
                {
                    Title = "Book Appointment",
                    Type = ActionTypes.OpenUrl,
                    Value = $"https://www.bing.com/search?q=easj+roskilde+" + HttpUtility.UrlEncode(meeting.Location)
                }
            }
        };

        resultMessage.Attachments.Add(heroCard.ToAttachment());
    }

    await context.PostAsync(resultMessage);
}
catch (FormCanceledException ex)
{
    string reply;

    if (ex.InnerException == null)
    {
        reply = "You have canceled the operation.";
    }
    else
    {
        reply = $"Oops! Something went wrong :( Technical Details: {ex.InnerException.Message}";
    }

    await context.PostAsync(reply);
}
finally
{
    context.Wait(DeconstructionOfDialog);
}
}


private async Task<IEnumerable<Meeting>> GetMeetingsAsync(MeetingsQuery searchQuery)
{
    var meetings = new List<Meeting>();

    //some random result manually for demo purposes
    for (int i = 1; i <= 5; i++)
    {
        var random = new Random(i);
        Meeting meeting = new Meeting()
        {
            DateTime = $" Available time: {searchQuery.Date} At building {i}",
            Teacher = $" Professor {searchQuery.Name}",
            Location = $" Elisagårdsvej 3, Room {random.Next(1, 300)}",
            Image = $"https://placeholdit.imgix.net/~text?txtsize=35&txt=Supervision+{i}&w=500&h=260"
        };

        meetings.Add(meeting);
    }

    return meetings;
}

最奇怪的是,这段代码起作用了,我对 GitHub 上的社区表示敬意和尊重,因为我认为这是一个很棒的平台,拥有大量文档和示例。


这是已知问题(也报告了here and here).

长话短说,由于 BotBuilder 尚不支持builtin.datetimeV2.* 实体,Resolution字典的EntityRecommendation最终得到一个值为 type 的条目JArray。当您将这些实体传递给FormDialog。由于实体是对话框中的私有字段,并且当然与任何其他对话框一样,正在被序列化,因此会抛出异常,因为JArray班级来自Newtonsoft未标记为可序列化。

添加对 datetimeV2 实体的支持的请求是here.

我现在能想到的解决方法是手动提取 DateTime 实体的值并将其分配给您Date你的领域MeetingsQuery您传递给的实例FormDialog并从中删除 DateTime 实体result.Entities您要传递给的集合FormDialog.

Update

正如您所见,这个问题已经在 SDK 中修复了这个请求请求.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BotFramework 和 LUIS 出现 JSON 序列化器错误 的相关文章

  • 如何获取枚举数作为常量?

    From 枚举中定义的项目总数 https stackoverflow com questions 856154 total number of items defined in an enum 我发现我可以使用以下方法获取枚举数 Enum
  • 处理器关联组 C#

    我使用的是 72 核的 Windows Server 2016 我看到有两组处理器 我的 net 应用程序将使用一个或其他组 我需要能够强制我的应用程序使用我选择的组 我看到下面的代码示例 但我无法使其工作 我可能传递了错误的变量 我希望应
  • 使用 C 的另一个结构内的灵活长度结构数组

    你好 我正在尝试使用 C 来实现一个简单的结构 2 个盒子 每个盒子包含不同数量的颗粒 main 中传递的粒子的确切数量 我写了以下代码 typedef struct Particle float x float y float vx fl
  • 二叉树和快速排序?

    我有一个家庭作业 内容如下 别生气 担心 我是not请你帮我做作业 编写一个程序 通过使用二分查找的快速排序方法对一组数字进行排序 树 推荐的实现是使用递归算法 这是什么意思 到目前为止 这是我的解释 正如我在下面解释的那样 我认为两者都有
  • 如何在 Google Mock 中使用可选参数来模拟方法?

    如何使用可选参数模拟方法谷歌模拟 例如 class A public void set enable bool enabled true class MockA public A MOCK METHOD1 set enable void b
  • 使用c#在mac上启动外部进程

    我成功地使用 System Diagnostics Process Start 在 Windows 上启动我的外部单声道可执行文件 然而在mac上却失败了 我没有收到任何错误 只是什么也没发生 我尝试按以下方式进行操作 System Dia
  • R 包与 Rcpp 的链接错误:“未定义符号:LAPACKE_dgels”

    我正在创建一个 R 包 lapacker 以使用 R API 头文件 R ext Lapack h 为 R 提供和使用的内部 LAPACK 库 仅具有双精度和双复数 提供 C 接口 源代码 https github com ypan1988
  • 如何查看每秒更新的图表中的最后 10 个数据点?

    我有这个代码 private void timer Tick object sender EventArgs e timer Stop for int i 0 i lt TOTAL SENSORS i DateTime d DateTime
  • 将两个垂直滚动条相互绑定

    我在控件中有两个 TextBox 并且它们都有两个 VerticalScrollBar 我想在它们之间绑定 VerticalScrollBars 如果一个向上 第二个也会向上等等 如果可以的话我该怎么做 Thanks 不是真正的绑定 但它有
  • 将 JavaScript 引擎嵌入到 .NET 中 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 只是想知道是否有人尝试过将任何 js 引擎嵌入并实际集成到 net 环境中 我可以找到并实际使用 经过L
  • 一个领域模型,多个 json 视图

    我们有一组域类 它们使用球衣服务通过 jackson 序列化为 json 我们目前正在使用 JAXB 对类进行注释 尽管我们并不局限于此 这很好用 但我们希望为不同的用例提供不同的类序列化 Web site 移动应用程序 管理工具 公共AP
  • 为什么 C# 中的命名空间允许循环依赖?

    在 c 中 您可以在文件 a cs 其命名空间为 MyApp A 中拥有一条语句 using MyApp B 而文件 b cs 其名称空间为 MyApp B 已经包含该语句 using MyApp A 如果类似的依赖关系存在于不同的 dll
  • 结构大小与 typedef 版本不同?

    我的代码中有以下结构声明和 typedef struct blockHeaderStruct bool allocated unsigned int length typedef struct blockHeaderStruct block
  • ThreeJS无法加载Json文件

    首先 我已经读过这个问题 https stackoverflow com questions 17201888 three js exporter export object not working with jsonloader r58没
  • 用 std::generate_n 填充 std::map

    我想填写一个std map using std generate n但无法让它发挥作用 我尝试过的是这样的事情 unsigned number of pairs 5 std map
  • Microsoft Visual Studio 2017 中的 wxWidgets 设置

    我花了大约 20 个小时试图弄清楚如何在 Microsoft Visual Studio 2017 中设置 wxWidgets 我遵循 https wiki wxwidgets org Microsoft Visual C 2B 2B Gu
  • 如何检查日期时间是否发生在今天?

    有没有比下面的代码更好的 net 方法来检查 今天 是否发生了 DateTime if newsStory WhenAdded Day DateTime Now Day newsStory WhenAdded Month DateTime
  • 在 C 中运行 setuid 程序的正确方法

    我有一个权限为4750的进程 我的Linux系统中存在两个用户 root 用户和 appz 用户 该进程继承以 appz 用户身份运行的进程管理器的权限 我有两个基本惯例 void do root void int status statu
  • 为什么在一行中使用这个 C++ 函数两次会导致编译错误?

    我在尝试在 Visual C 2010 中实现智能相等测试宏类型模板函数时遇到了一些麻烦 该函数与VS 中关于模板函数默认参数的错误 https stackoverflow com questions 10343177 why do i g
  • 在派生类中访问基类变量

    class Program static void Main string args baseClass obj new baseClass obj intF 5 obj intS 4 child obj1 new child Consol

随机推荐

  • 如何修改 Mule 负载变量?

    使用 Mule 3 3 我得到了一个有效负载 它以 JSON 形式开始 我使用 java util HashMap 将其转换为对象 我可以使用 JDBC 查询很好地访问变量 message payload AddJob variable1
  • 在php中创建每周日历

    我创建了一个 php 日历 一次显示一周 这是我创建的代码 a href Next Week a a href a
  • 如何为 HTML/CSS 页面添加加载更多按钮?

    我想制作一个单页网站 它将包含大量内容 假设上面有 1000 张照片 我不希望人们等待 5 分钟才能加载我的页面 所以我想在页面底部添加 加载更多 按钮 如何使用 HTML CSS JS 做到这一点 你可以设置所有divs to displ
  • androidcursor.getBlob 不工作

    您好 我尝试在 sqlite 数据库中存储和检索图像 我的以下代码不起作用 我不确定我做错了什么 请帮忙 我创建的数据库表如下 db openOrCreateDatabase StudentDB Context MODE PRIVATE n
  • 在 Mongo/RectiveMongo 中存储/获取列表引用的值的最佳方式?

    我有一个非常常见的用例 评论列表 每个评论都有一个作者 我使用引用存储评论中对作者的引用 因为作者可以发表多个评论 现在我正在使用 ReactiveMongo 并希望尝试保持数据库访问异步 但在这种情况下 我不知道如何做 我对数据库进行异步
  • Android 序列化/对象传递和返回

    所以我有一个管理工单的应用程序 在应用程序的一部分中 我有一个从网络服务检索到的工作订单列表 然后 用户从列表中选择一个工作订单 列表将启动一个显示工作订单详细信息的新活动 将工作订单对象传递给它 用户可以在此期间编辑工作订单的部分内容 如
  • 使用已删除的函数‘sf::RenderWindow& sf::RenderWindow::operator=(const sf::RenderWindow&)’

    我对 C 还很陌生 所以请放轻松 我正在尝试使用 sfml 创建一个 RenderWindow 然后 在创建播放器时 该播放器的关联 窗口 对象将设置为之前创建的 RenderWindow 我的目的是能够从播放器对象运行窗口方法 例如 wi
  • 如何直接初始化一个HashMap(以字面的方式)?

    有没有像这样初始化 Java HashMap 的方法 Map
  • 无法安装APK

    我正在使用 Eclipse GanymedeADT 10 0插件和Android3 0 SDK构建我的应用程序 当我尝试在手机上部署应用程序时 我在控制台上看到以下内容 2011 05 06 10 35 38 MyProject Faile
  • jquery is(":visible") 和 is(":animated") 动画期间的错误?

    事情是这样的 我有多个图标 每个图标在 div 中显示一条消息 当我将鼠标悬停在图标上时 该框会显示 当我将鼠标移出时 它会关闭 当我单击时 我希望该框不会自动关闭 但仅在我单击该框角落的 X 后才关闭 这一切都很顺利 直到我添加了动画 问
  • CSS:如何强制背景图像拉伸/压缩以适合div,而不保持纵横比

    我遇到了一个令人沮丧的问题 希望得到一些帮助 我编写了一个脚本 允许我调整屏幕上为客户构建的应用程序的 div 大小 但我遇到了一个以前从未遇到过的幽默问题 我知道有很多方法可以确保图像Does保持其纵横比 但我不知道如何强制不这样做 例如
  • 获取SWF版本信息

    在 FlashBuilder 的编译器选项 属性 gt Flex 编译器 中 在 Adobe Flash Player 选项 下有一个 使用特定版本 的选项 您可以在其中告诉它要链接到哪个 Flash Player 如何在运行时获取这个值
  • ImageMagick 将大图像裁剪为 xyz 块

    我有一个大的 jpg 其分辨率为 x 256 x 256 我想将此图像剪切成 256x256 的图块 命名约定为 zoom x y jpg 过去我使用 ZoomifyExpress Converter 来进行剪切和缩放 我还想要 6 种不同
  • 确定两个 IP 地址是否在同一子网中 - IP 地址中的前导 0 或尾随 0 是否被删除?

    我知道如果两个 IP 地址与子网掩码进行 AND 运算 如果结果相同 那么它们位于同一网络上 如果结果不同 则它们位于不同的网络上 我的问题是 当给定的 IP 地址省略一些 0 时 多余的 0 放在哪里 例如 如果子网掩码是 255 128
  • 在 Mvc.Controller 中使用服务器

    我有自己的遗传App Controller from Mvc Controller然后我的所有控制器都继承自它 我利用接口编写了一个提供程序并将其实现为MyService并且构造函数采用Server的财产Mvc Controller这是属于
  • 按索引对 numpy.array 行进行排序

    我有 2Dnumpy array和一个索引元组 a array 0 0 0 1 1 0 1 1 ix 2 0 3 1 如何按索引对数组的行进行排序 预期结果 array 1 0 0 0 1 1 0 1 我尝试使用numpy take 但它只
  • 不断收到 org.hibernate.exception.JDBCConnectionException: 无法执行查询

    我有一个 J2EE 应用程序 它使用 JSP 页面作为前端 使用 Struts2 作为控制器 我还使用 Hibernate 将对象映射到 MySql DB 当我在服务器上部署应用程序时 它工作正常 但在不可预测的一段时间 例如一两天 之后
  • 在多个 settimeout 上使用 Async/Await

    为了理解 async await 我尝试在 settimeout 运行并到期后显示一条控制台消息 如何修复下面的代码 我有 5 个 settimeout 函数 每个函数完成后都应显示各自的消息 function t1 setTimeout
  • 以编程方式查找 sql server 的所有实例

    我知道有很多与此类似的主题 但没有一个提供我正在寻找的正确答案 我正在努力收集我们网络上的所有 SQL Server 实例 它应该能够检测正在运行的 SQl Server 版本 我们运行的不同版本之间存在差异 SQL Server 2000
  • BotFramework 和 LUIS 出现 JSON 序列化器错误

    StackOverflow 社区 我有一个聊天机器人 并集成了 LUIS ai 以使其更加智能 其中一个对话即将与主管 老师 预约 一切都运行良好 代码完全相同 几个小时前 我遇到了一些奇怪的错误 Exception Type Newton