如何在自适应对话框 HttpRequest 中从 xml 转换为 json?
Posted
技术标签:
【中文标题】如何在自适应对话框 HttpRequest 中从 xml 转换为 json?【英文标题】:How to convert from xml to json within Adaptive dialog HttpRequest? 【发布时间】:2020-11-01 18:44:48 【问题描述】:我是 Bot Framework 和 C# 的新手。我正在使用带有核心航班预订模板 (adaptive-dialog/03.core-bot) 的自适应对话框构建聊天机器人。我想调用 API 来获取天气信息。此 OpenWeather API 可以返回 JSON、XML 或 html 格式的数据。当响应是 JSON 格式时,很容易访问键值对。但是当响应是 XML 格式时,所有内容都将转换为字符串并保存为响应中的“内容”,我必须将其转换为 JSON 或字典,以便我可以访问详细信息。而且我需要将 API 响应保存为对话框中的属性以供以后参考。
我知道我们可以使用以下代码将 XML 转换为 JSON,但问题是如何在自适应对话框中进行。我尝试在 HttpRequest 块中包含以下代码,但收到错误 “XmlDocument 是一种类型,在给定的上下文中无效。” 似乎您无法在自适应对话框,你可以做的只是使用模板可以提供的,但是现在 HttpRequest 类没有解析 XML 响应的选项。谁能给我一些指导?谢谢!
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string json = JsonConvert.SerializeXmlNode(doc);
在自适应对话框中生成 HttpRequest 的代码:
new IfCondition()
Condition = "conversation.Id != null",
Actions = new List<Dialog>()
new HttpRequest()
Url = "http://api.openweathermap.org/data/2.5/weatherq=Detroit&mode=xml&appid=appid=your api key",
ResultProperty = "dialog.httpResponse",
Method = HttpRequest.HttpMethod.GET,
ResponseType = HttpRequest.ResponseTypes.Json
,
new Send Activity("$dialog.httpResponse"),
new Send Activity("$dialog.httpResponse.content")
下面显示了 HttpRequest 响应的样子。 OpenWeather API 响应(XML 格式)被转换为字符串作为 'content' 的值。
"statusCode": 200,
"reasonPhrase": "OK",
"headers":
"Server": "openresty",
"Date": "Tue, 14 Jul 2020 18:57:41 GMT",
"Connection": "keep-alive",
"X-Cache-Key": "/data/2.5/weather?mode=xml&q=detroit",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials": "true",
"Access-Control-Allow-Methods": "GET, POST"
,
"content": "<?xml version="1.0" encoding="UTF-8"?>\n
<current>
<city id="4990729" name="Detroit">
<coord lon="-83.05" lat="42.33"></coord>
<country>US</country>
<timezone>-14400</timezone>
<sun rise="2020-07-14T10:08:16" set="2020-07-15T01:07:33"></sun>
</city>
<temperature value="301.11" min="300.15" max="302.59" unit="kelvin"></temperature>
<feels_like value="301.1" unit="kelvin"></feels_like>
<humidity value="44" unit="%"></humidity>
<pressure value="1019" unit="hPa"></pressure>
<wind>
<speed value="2.1" unit="m/s" name="Light breeze"></speed>
<gusts></gusts>
<direction></direction>
</wind>
<clouds value="75" name="broken clouds"></clouds>
<visibility value="16093"></visibility>
<precipitation mode="no"></precipitation>
<weather number="803" value="broken clouds" icon="04d"></weather>
<lastupdate value="2020-07-14T18:57:41"></lastupdate>
</current>"
【问题讨论】:
欢迎来到 Stack Overflow。您是否愿意编辑您的帖子,以便您的 JSON 是格式化的代码块而不是屏幕截图?请查看方便的指南,了解您可以采取哪些步骤来更快地获得更好的答案:***.com/help/how-to-ask 感谢您的评论,@KyleDelaney。我已根据您的建议更新了问题,JSON 响应的屏幕截图已替换为格式化的代码块。 您说“这个 OpenWeather API 可以返回 JSON、XML 或 HTML 格式的数据。”那么,您为什么不直接获取 JSON 格式的数据呢?你能链接到 API 文档吗? 感谢您的回复,凯尔。实际上,我只是在这里使用 OpenWeather API 作为示例,由于隐私问题,我无法透露我需要调用的实际 API。对于实际的 API,只有 XML 格式的响应,否则我可以直接使用 JSON 响应。谢谢。 【参考方案1】:您可以使用代码操作。
new IfCondition()
Condition = "conversation.Id != null",
Actions = new List<Dialog>()
new HttpRequest()
Url = "http://api.openweathermap.org/data/2.5/weatherq=Detroit&mode=xml&appid=appid=your api key",
ResultProperty = "dialog.httpResponse",
Method = HttpRequest.HttpMethod.GET,
ResponseType = HttpRequest.ResponseTypes.Json
,
new CodeAction(async (dc, options) =>
var xml = dc.State.GetValue("dialog.httpResponse.content", () => "<root></root>");
var doc = new XmlDocument();
doc.LoadXml(xml);
var json = JsonConvert.SerializeXmlNode(doc);
dc.State.SetValue("dialog.json", json);
return await dc.EndDialogAsync();
),
new SendActivity("$dialog.json"),
【讨论】:
谢谢你,凯尔!我试图使用CodeAction
,但不知道如何访问自定义代码中的dialog.httpResponse
。您提供的上述代码效果很好。我又添加了一行来解析 json,以便可以从dialog.json
直接访问键值对。在var json = JsonConvert.SerializeXmlNode(doc);
之后,我添加了var json_final = JObject.Parse(json);
,然后将json_final
设置为dialog.json
的值,这样就可以使用"$dialog.json.current.weather"
获取天气信息了。以上是关于如何在自适应对话框 HttpRequest 中从 xml 转换为 json?的主要内容,如果未能解决你的问题,请参考以下文章