c# - 如何在 ASP.Net Core 中使用 Google.Protobuf.WellknownTypes.Struct

标签 c# asp.net-core dialogflow-es

我正在为我的 Google Dialogflow Agent 实现一个 webhookreceiver 作为 ASP.Net Core Webapp。为此,我正在使用 Google.Cloud.Dialogflow.V2(1.0.0-beta02) nuget 包。当 Dialogflow 匹配某个意图时,我希望我的 ASP webapp 调用 TMDb API 来检索有关特定电影的信息。我想将此信息作为谷歌卡片发送回 Dialogflow。 为了将内容发送回 Dialogflow,我使用 WebhookResponse 类(由 Google.Cloud.Dialogflow.V2 提供)。现在我的问题在于如何匹配 Dialogflow 期望的模式,它看起来像这样:

"messages": [
  {
    "buttons": [
      {
        "postback": "Card Link URL or text",
        "text": "Card Link Title"
      }
    ],
    "imageUrl": "http://urltoimage.com",
    "platform": "facebook",
    "subtitle": "Card Subtitle",
    "title": "Card Title",
    "type": 1
  }
]

到目前为止,我发现我需要将上述 Json 作为 Webhook 响应的有效负载的一部分。 ( https://github.com/googleapis/google-cloud-dotnet/issues/2425#issuecomment-459885762 )

但是使用Github评论中提供的方法很难匹配到上述模式。 我知道 Json 对象(一对大括号之间的所有内容)等同于这行代码

Value.ForStruct(new Struct { Fields = { ["expectUser"] = Value.ForBool(true) } })

我似乎无法找出什么是 Json 数组的等效项(一对方括号之间的所有内容) 我假设我必须使用

Value.ForList()

但是当我尝试它时它不会编译(请参阅下面的代码我是如何尝试的)。

 Payload = new Struct {
               Fields ={["messages"] = Value.ForList(new Struct {
                        Fields = {["buttons"] = Value.ForStruct(new Struct {
                                   Fields = {["postback"] = Value.ForString("Card link url or test"),
                                             ["text"] = Value.ForString("card link title")}
                                   })
                        } })
                }
           }

此片段应该是第一个 Codeblock 中 Json 结构的前 8 行。 (我已经尽力格式化了,应该不会漏掉任何括号)

VS2017中的错误是:

Argument 1: cannot convert from 'Google.Protobuf.WellKnownTypes.Struct' to 'Google.Protobuf.WellKnownTypes.Value'

有谁知道如何使用 Google.Protobuf 或者是否有其他方法可以让我的 Dialogflow 代理显示卡片?

感谢任何帮助。

最佳答案

Struct 本身不是 Value - 您需要使用 Struct.ForValue 来创建 Value。这一切都有些冗长,但确实有效。但是,看起来 buttons 无论如何都需要是另一个列表。这是一个为有效负载创建原始 JSON 的完整示例:

using Google.Protobuf.WellKnownTypes;
using System;

class Program
{
    static void Main(string[] args)
    {
        var button = Value.ForStruct(new Struct
        {
            Fields =
            {
                ["postback"] = Value.ForString("Card Link URL or text"),
                ["text"] = Value.ForString("Card Link Title")
            }
        });
        var message = Value.ForStruct(new Struct
        {
            Fields =
            {
                ["buttons"] = Value.ForList(button),
                ["imageUrl"] = Value.ForString("http://urltoimage.com"),
                ["platform"] = Value.ForString("facebook"),
                ["subtitle"] = Value.ForString("Card Subtitle"),
                ["title"] = Value.ForString("Cart Title"),
                ["type"] = Value.ForNumber(1)
            }
        });
        var payload = new Struct { Fields = { ["messages"] = Value.ForList(message) } };
        Console.WriteLine(payload);
    }
}

我怀疑一些辅助方法可以使这更简单,但这至少应该解除你的阻碍。

关于c# - 如何在 ASP.Net Core 中使用 Google.Protobuf.WellknownTypes.Struct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56078753/

相关文章:

c# - C#的统计收集工具?

c# - 使用 MessageBox 对函数进行单元测试

c# - 从数据库加载 ASP.Net Core 授权策略

asp.net - 上下文菜单不包含脚手架 VS2015 ASP.NET 5

java - 为什么 WebhookResponse 构建器在 json 中创建错误的 key ?

actions-on-google - Dialogflow : Programmatically set Fulfillment URL, Google 助理集成设置

c# - 如何将数组中的 jpeg 转换为位图

c# - 无法从我的类库中捕获异常

asp.net-core - 在cloudformation模板中定义lambda函数

dialogflow-es - 如何在 Google Actions 中使用 Firebase 数据库?