C# 如何从Unity中的Watson对话服务获取$context变量?
我正在尝试获取我在Unity项目的Watson对话对话框中创建的上下文变量。我能够让整个JSON对话框显示在Unity中,从JSON文件中获取意图、实体和输出文本。因此,我不是从json文件中获取输出:{text[],而是试图从json文件中获取上下文:{variable:value,但我不知道该怎么做 这是welcome dialog节点的JSON文件,我想从中读取目的地城市变量,将其设置为Unity变量/字符串C# 如何从Unity中的Watson对话服务获取$context变量?,c#,unity3d,ibm-watson,watson-conversation,watson,C#,Unity3d,Ibm Watson,Watson Conversation,Watson,我正在尝试获取我在Unity项目的Watson对话对话框中创建的上下文变量。我能够让整个JSON对话框显示在Unity中,从JSON文件中获取意图、实体和输出文本。因此,我不是从json文件中获取输出:{text[],而是试图从json文件中获取上下文:{variable:value,但我不知道该怎么做 这是welcome dialog节点的JSON文件,我想从中读取目的地城市变量,将其设置为Unity变量/字符串 { "context": { "date": null,
{
"context": {
"date": null,
"time": null,
"hotel": null,
"DateEnd": null,
"DateBegin": null,
"PeriodDate": null,
"numberKids": null,
"roomsHotel": null,
"PeriodNumber": null,
"numberAdults": 0,
"departure_city": null,
"transportation": null,
"destination_city": "London",
"kidDiscountRepeat": null
},
"output": {
"text": {
"values": [
"Hello, this is the Watson Travel agency."
],
"selection_policy": "sequential"
}
}
}
这是我在Unity中获得Watson对话响应并显示该对话节点的整个JSON文件的代码的一部分:
void HandleMessageCallback (object resp, Dictionary customData)
{ object _tempContext = null; (resp as Dictionary ).TryGetValue("context", out _tempContext);
if (_tempContext != null)
conversationContext = _tempContext as Dictionary<string, object>;
Dictionary<string, object> dict = Json.Deserialize(customData["json"].ToString()) as Dictionary<string, object>;
// load output --> text;answer from Json node
Dictionary <string, object> output = dict["output"] as Dictionary<string, object>;
List<object> text = output["text"] as List<object>;
string answer = text[0].ToString();
Debug.Log("WATSON | Conversation output: \n" + answer);
//======== Load $ context variable attempts =============================
Debug.Log("JSON INFO: " + customData["json"].ToString());
//=====================================
if (conversationOutputField != null)
{
conversationOutputField.text = answer;
}
void HandleMessageCallback(对象响应,字典自定义数据)
{object{u tempContext=null;(resp as Dictionary).TryGetValue(“context”,out{u tempContext);
if(_tempContext!=null)
conversationContext=_tempContext作为字典;
Dictionary dict=Json.Deserialize(customData[“Json”].ToString())为Dictionary;
//加载输出-->文本;从Json节点应答
字典输出=作为字典的dict[“output”];
列表文本=输出[“文本”]作为列表;
字符串应答=文本[0]。ToString();
Log(“WATSON |对话输出:\n”+应答);
//=======加载$context变量尝试次数=============================
Log(“JSON信息:+customData[“JSON”].ToString());
//=====================================
if(conversationOutputField!=null)
{
conversationOutputField.text=答案;
}
解决方案1:保留您的代码
以您当前的代码为例,您应该能够使用
var context = dict["context"] as Dictionary<string, object>
结论1
即使这是可行的,但如果您正在设置一个处理/访问Json的解决方案,我强烈建议您创建数据模型,以便进行序列化,为此,请查看Unity的(Json序列化)
解决方案2:在Json之间序列化C#对象
让我们以Unity的手册为例:
数据模型类
首先,我们创建一个我们想要的Json信息的模型
类,在本例中,我们想要关于我们的播放器的信息,为此我们创建了3个字段,int-level
,float-timeappeased
和string-playerName
[Serializable]
public class MyClass
{
public int level;
public float timeElapsed;
public string playerName;
}
数据初始化
在这里,我们创建了一个名为myObject
的类MyClass
的新实例,并手动设置它的字段值(实际上,在这里如何设置值并不重要)
将类序列化为Json
要序列化您的myObject
,只需将它作为参数传递给JsonUtility
的.ToJson
方法
string json = JsonUtility.ToJson(myObject);
现在,我们将类的对象等效为Json字符串:
{“级别”:1,“时间流逝”:47.5,“玩家名称”:“查尔斯·弗朗西斯博士”}
从类生成Json
如果要使用Json中的数据填充C#对象,可以通过调用JsonUtility
的.FromJson
方法并将Json字符串作为参数传递给它来实现
myObject = JsonUtility.FromJson<MyClass>(json);
myObject=JsonUtility.FromJson(json);
这些只是基本的操作,以及JsonUtility的类/Json序列化所能做的表面
结论2
此解决方案更易于维护。您可以将其扩展为使用任意数量的模型类型,并具有C#对象导航的优势和方便性。创建使用数据对象的系统尤其有趣
如果您对Json实用程序有疑问,比如如何管理数组、嵌套数据等,我强烈建议您花几分钟时间阅读实践
资源
text[0]
应该是值
,如果你想要里面的东西,你可能应该试试text[0][0]
,它会告诉你“你好,这里是屈臣氏旅行社。”
。您还应该查看Foreach
,因为您将所有内容都设置为I集合
,您不必为管理索引而烦恼。此外,我从未看到conversationOutputField
在任何地方被初始化,它的价值是什么?感谢您的帮助,但我已经可以访问并显示“您好,这里是沃森旅行社”部分。我试图访问的是目的地城市:“伦敦”部分。您已经有了dict
,如果使用var myCity=dict[“context”][“destination\u city”]作为字典;
则应该能够访问该部分;这不起作用。我得到错误:无法使用[]对于'object'类型的表达式,哦,对不起,我跑得太快了x)是的,它是var context=dict[“context”]作为字典
您应该可以使用context[“destination\u city”]
访问它,谢谢!这真是一个很好的答案!
string json = JsonUtility.ToJson(myObject);
myObject = JsonUtility.FromJson<MyClass>(json);