【发布时间】:2018-12-14 18:05:19
【问题描述】:
我目前需要创建一个脚本,该脚本需要通过匹配我在 excel 文件中的问题来更新 QnA Maker 中 qna 对的元数据。我目前正在遵循 REST API 指南:
https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/quickstarts/csharp
我已经从 QnA Maker 检索了 qna 对,但由于它返回了所有 qna 信息的字符串值,我需要将其转换为 JSON 并将其与我从我的 excel 文件中检索到的 QnA 对象列表进行匹配。
public async static Task<string> GetQnAFromQnAMaker()
{
string getmethod = "/knowledgebases/{0}/{1}/qna/";
var method_with_id = String.Format(getmethod, kbid, env);
var uri = host + service + method_with_id;
Console.WriteLine("Calling " + uri + ".");
var response = await Get(uri);
return response;
}
我使用了 NewtonSoft 反序列化对象
List<FAQs> qnaMakerFaq = JsonConvert.DeserializeObject<List<FAQs>>(qnaFromQnAMaker.Result);
但我收到此错误:
Newtonsoft.Json.JsonSerializationException: '无法反序列化 当前 JSON 对象(例如 {"name":"value"})转换为类型 'System.Collections.Generic.List`1[ExcelToQnAMaker.FAQs]' 因为 type 需要一个 JSON 数组(例如 [1,2,3])才能正确反序列化。至 修复此错误或者将 JSON 更改为 JSON 数组(例如 [1,2,3]) 或更改反序列化类型,使其成为普通的 .NET 类型(例如 不是像整数这样的原始类型,不是像数组这样的集合类型 或列表)可以从 JSON 对象反序列化。 JsonObjectAttribute 也可以添加到类型中以强制它 从 JSON 对象反序列化。路径“qnaDocuments”,第 2 行,位置 17.'
我返回的结果字符串看起来像这样......
"{\r\n \"qnaDocuments\": [\r\n {\r\n \"id\": ....
这是我的常见问题解答课
public class FAQs
{
public List<string> Questions { get; set; }
public string Answers { get; set; }
public string Classification { get; set; }
public string Division { get; set; }
public int Spid { get; set; }
public int Kbid { get; set; }
}
【问题讨论】:
-
因为错误清楚地表明您的映射对象
FAQs没有任何名为qnaDocuments的属性,其中包含数据数组。 -
您正试图反序列化为一个集合,但根 JSON 容器是一个对象,因此您会遇到与 Cannot deserialize the current JSON object (e.g. {“name”:“value”}) into type 'System.Collections.Generic.List`1 相同的错误。您的数据模型也可能有误,请参阅How to auto-generate a C# class file from a JSON object string。任何进一步的帮助都需要minimal reproducible example,特别是收到的完整 JSON。