C# 如何连接反序列化的QnAResponse字符串来代替{filename}?

C# 如何连接反序列化的QnAResponse字符串来代替{filename}?,c#,json,botframework,qnamaker,C#,Json,Botframework,Qnamaker,在本文档中,它显示了QnA Maker服务执行Rest调用和反序列化Json响应-步骤3* 我想寻找的模块字符串的特定部分: /* START - QnA Maker Response Class */ public class Metadata { public string name { get; set; } public string value { get; set; } } public class Answer { public IList<stri

在本文档中,它显示了QnA Maker服务执行Rest调用和反序列化Json响应-步骤3*

我想寻找的模块字符串的特定部分:

/* START - QnA Maker Response Class */
public class Metadata
{
    public string name { get; set; }
    public string value { get; set; }
}

public class Answer
{
    public IList<string> questions { get; set; }
    public string answer { get; set; }
    public double score { get; set; }
    public int id { get; set; }
    public string source { get; set; }
    public IList<object> keywords { get; set; }
    public IList<Metadata> metadata { get; set; }
}

public class QnAAnswer
{
    public IList<Answer> answers { get; set; }
}
/* END - QnA Maker Response Class */
/*开始-QnA制造商响应类*/
公共类元数据
{
公共字符串名称{get;set;}
公共字符串值{get;set;}
}
公开课答案
{
公共IList问题{get;set;}
公共字符串答案{get;set;}
公共双倍分数{get;set;}
公共int id{get;set;}
公共字符串源{get;set;}
公共IList关键字{get;set;}
公共IList元数据{get;set;}
}
公共类QNAR答案
{
公共IList答案{get;set;}
}
/*结束-QnA生成器响应类*/
我不想猜测这其中的哪一部分会有答案,但QNA应该简单地用文件名回答一个问题,然后需要将该文件名连接到@~\folder\folder\文件名.json中,这样一个适当的存储自适应卡就会显示为响应

我提供了比必要的更多的上下文,因为我确信还有其他人希望在有问题需要时,用一种简单的方式展示一张卡片

请随意编辑或用适当的术语重新表述


谢谢

如果我答对了你的问题,你正在寻找机器人的答案。如果是这样,答案将出现在HTTP响应的主体中,如下所示

{
    "answers": [
        {
            "questions": [
                "What is the closing time?"
            ],
            "answer": "10.30 PM",
            "score": 100,
            "id": 1,
            "source": "Editorial",
            "metadata": [
                {
                    "name": "restaurant",
                    "value": "paradise"
                },
                {
                    "name": "location",
                    "value": "secunderabad"
                }
            ]
        }
    ]
}
所以从理论上讲,这是答案

编辑:

您需要先添加此方法:

    public string GetAnswer(string query)
    {
        var client = new RestClient( qnaServiceHostName + "/qnamaker/knowledgebases/" + knowledgeBaseId + "/generateAnswer");
        var request = new RestRequest(Method.POST);
        request.AddHeader("authorization", "EndpointKey " + endpointKey);
        request.AddHeader("content-type", "application/json");
        request.AddParameter("application/json", "{\"question\": \"" + query + "\"}", ParameterType.RequestBody);
        IRestResponse response = client.Execute(request);

        // Deserialize the response JSON
        QnAAnswer answer = JsonConvert.DeserializeObject<QnAAnswer>(response.Content);

        // Return the answer if present
        if (answer.answers.Count > 0)
            return answer.answers[0].answer;
        else
            return "No good match found.";
    }
}
publicstringgetanswer(字符串查询)
{
var client=new RestClient(qnaservicecostname+“/qnamaker/knowledgebase/“+knowledgeBaseId+”/generateAnswer”);
var请求=新的重新请求(Method.POST);
AddHeader(“授权”、“EndpointKey”+EndpointKey);
AddHeader(“内容类型”、“应用程序/json”);
AddParameter(“application/json”,“{\'question\:\”“+query+“\”}”,ParameterType.RequestBody);
IRestResponse response=client.Execute(请求);
//反序列化响应JSON
QnAAnswer=JsonConvert.DeserializeObject(response.Content);
//如果有,请返回答案
如果(answer.answers.Count>0)
返回答案。答案[0]。答案;
其他的
返回“未找到好匹配项。”;
}
}
然后你可以打电话:

Console.WriteLine(“今天天气如何的答案是:”+GetAswers(“今天天气如何”)+“…答案结束”)


好了。

如果我答对了你的问题,你正在寻找机器人的答案。如果是这样,答案将出现在HTTP响应的主体中,如下所示

{
    "answers": [
        {
            "questions": [
                "What is the closing time?"
            ],
            "answer": "10.30 PM",
            "score": 100,
            "id": 1,
            "source": "Editorial",
            "metadata": [
                {
                    "name": "restaurant",
                    "value": "paradise"
                },
                {
                    "name": "location",
                    "value": "secunderabad"
                }
            ]
        }
    ]
}
所以从理论上讲,这是答案

编辑:

您需要先添加此方法:

    public string GetAnswer(string query)
    {
        var client = new RestClient( qnaServiceHostName + "/qnamaker/knowledgebases/" + knowledgeBaseId + "/generateAnswer");
        var request = new RestRequest(Method.POST);
        request.AddHeader("authorization", "EndpointKey " + endpointKey);
        request.AddHeader("content-type", "application/json");
        request.AddParameter("application/json", "{\"question\": \"" + query + "\"}", ParameterType.RequestBody);
        IRestResponse response = client.Execute(request);

        // Deserialize the response JSON
        QnAAnswer answer = JsonConvert.DeserializeObject<QnAAnswer>(response.Content);

        // Return the answer if present
        if (answer.answers.Count > 0)
            return answer.answers[0].answer;
        else
            return "No good match found.";
    }
}
publicstringgetanswer(字符串查询)
{
var client=new RestClient(qnaservicecostname+“/qnamaker/knowledgebase/“+knowledgeBaseId+”/generateAnswer”);
var请求=新的重新请求(Method.POST);
AddHeader(“授权”、“EndpointKey”+EndpointKey);
AddHeader(“内容类型”、“应用程序/json”);
AddParameter(“application/json”,“{\'question\:\”“+query+“\”}”,ParameterType.RequestBody);
IRestResponse response=client.Execute(请求);
//反序列化响应JSON
QnAAnswer=JsonConvert.DeserializeObject(response.Content);
//如果有,请返回答案
如果(answer.answers.Count>0)
返回答案。答案[0]。答案;
其他的
返回“未找到好匹配项。”;
}
}
然后你可以打电话:

Console.WriteLine(“今天天气如何的答案是:”+GetAswers(“今天天气如何”)+“…答案结束”)

就这样

QNA应该简单地用文件名回答问题,然后需要将文件名连接在@~\folder\folder\filename.json的位置,这样一个正确存储的自适应卡就会显示为响应

似乎您希望根据QnA Maker服务返回的结果,从json文件动态呈现自适应卡。要实现该要求,可以参考以下示例代码

[LuisIntent("Help")]
public async Task HelpIntent(IDialogContext context, LuisResult result)
{
    var replymes = context.MakeMessage();

    var answer = GetAnswer(result.Query);

    var cardjson = await GetCardText($"{answer}");

    var results = AdaptiveCard.FromJson(cardjson);
    var card = results.Card;

    replymes.Attachments.Add(new Attachment()
    {
        Content = card,
        ContentType = AdaptiveCard.ContentType,
        Name = "Card"
    });

    await context.PostAsync(replymes);
    context.Wait(MessageReceived);
}
GetCardText方法:

公共异步任务GetCardText(字符串cardName) { var path=System.Web.HttpContext.Current.Server.MapPath($“~/AdaptiveCards/{cardName}.json”); 如果(!File.Exists(path)) 返回字符串。空; 使用(var f=File.OpenText(path)) { return wait f.ReadToEndAsync(); } }
测试结果:

注意:

1) 在我上面的测试中,我的QnA Maker服务将直接返回文件名作为答案,因此我将返回的答案作为文件名传递

2) 我在我的bot应用程序中使用它来构建自适应卡对象

QNA应该简单地用文件名回答问题,然后需要将文件名连接在@~\folder\folder\filename.json的位置,这样一个正确存储的自适应卡就会显示为响应

似乎您希望根据QnA Maker服务返回的结果,从json文件动态呈现自适应卡。要实现该要求,可以参考以下示例代码

[LuisIntent("Help")]
public async Task HelpIntent(IDialogContext context, LuisResult result)
{
    var replymes = context.MakeMessage();

    var answer = GetAnswer(result.Query);

    var cardjson = await GetCardText($"{answer}");

    var results = AdaptiveCard.FromJson(cardjson);
    var card = results.Card;

    replymes.Attachments.Add(new Attachment()
    {
        Content = card,
        ContentType = AdaptiveCard.ContentType,
        Name = "Card"
    });

    await context.PostAsync(replymes);
    context.Wait(MessageReceived);
}
GetCardText方法:

公共异步任务GetCardText(字符串cardName) { var path=System.Web.HttpContext.Current.Server.MapPath($“~/AdaptiveCards/{cardName}.json”); 如果(!File.Exists(path)) 返回字符串。空; 使用(var f=File.OpenText(path)) { return wait f.ReadToEndAsync(); } }
测试结果:

注意:

1) 在我上面的测试中,我的QnA Maker服务将直接返回文件名作为答案