如何从 Unity 中的 Watson Conversation 服务获取 $context 变量?
How to get $context variables from the Watson Conversation Service in Unity?
我试图在我的 Unity 项目中获取我在 Watson Conversation Dialogs 中创建的上下文变量。我能够让整个 JSON 对话框显示在 Unity 中,从 json 文件中获取意图、实体和输出文本。因此,我没有从 json 文件中获取输出:{ text[],而是尝试从 JSON 文件中获取上下文:{ variable:value 但我做不到让我想想如何。
这是欢迎对话框节点的 JSON 文件,我想从中读取 destination_city 变量以将其设置为等于 Unity variable/string。
{
"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;
}
解决方案 1:保留您的代码
使用您当前的代码,您应该能够使用
访问您的上下文
var context = dict["context"] as Dictionary<string, object>
现在您有了上下文,您可以用同样的方式访问它的内容
var mycity = context["destination_city"]
结论 1
即使这确实有效,但如果您正在设置一个解决方案,您将要 manipulate/access Json,我强烈建议为您的数据制作模型以进行序列化和序列化,为此,查看Unity的JsonUtility(Json序列化)
解决方案 2:将 C# 对象与 Json
序列化
我们以Unity的手册为例:
数据模型Class
首先,我们创建一个 Model
class 我们想要的 Json 信息,在这种情况下,我们想要关于我们玩家的信息,为此我们创建了 3 个字段, int level
、float timeElapsed
和 string playerName
。
[Serializable]
public class MyClass
{
public int level;
public float timeElapsed;
public string playerName;
}
数据初始化
这里我们创建了一个名为 myObject
的 class MyClass
的新实例,并手动设置它的字段值(事实上,您如何设置值在这里并不重要)
MyClass myObject = new MyClass();
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject.playerName = "Dr Charles Francis";
将您的 class 序列化为 Json
要序列化您的 myObject
,只需将其作为参数
传递给 JsonUtility
的 .ToJson
方法
string json = JsonUtility.ToJson(myObject);
现在,我们的 class 对象相当于 Json 字符串:
{"level":1,"timeElapsed":47.5,"playerName":"Dr Charles Francis"}
正在从您的 class
生成 Json
如果您想用 Json 中的数据填充 C# 对象,您可以通过调用 JsonUtility
的 .FromJson<TypeOfTheClassImMappingTo>
方法并将其传递给 json 字符串作为参数。
myObject = JsonUtility.FromJson<MyClass>(json);
这些只是基本操作,您可以使用 Json 实用程序的 Class/Json 序列化
进行表面处理
结论 2
这个解决方案更易于维护。您可以扩展它以使用任意数量的模型类型,并利用 C# 对象的优势和轻松导航。这对于创建将使用您的数据对象的系统特别有趣。
如果您对 Json 实用程序有疑问,例如如何管理数组、嵌套数据等。我强烈建议您花几分钟时间通读 实践。
资源
我试图在我的 Unity 项目中获取我在 Watson Conversation Dialogs 中创建的上下文变量。我能够让整个 JSON 对话框显示在 Unity 中,从 json 文件中获取意图、实体和输出文本。因此,我没有从 json 文件中获取输出:{ text[],而是尝试从 JSON 文件中获取上下文:{ variable:value 但我做不到让我想想如何。
这是欢迎对话框节点的 JSON 文件,我想从中读取 destination_city 变量以将其设置为等于 Unity variable/string。
{
"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;
}
解决方案 1:保留您的代码
使用您当前的代码,您应该能够使用
访问您的上下文var context = dict["context"] as Dictionary<string, object>
现在您有了上下文,您可以用同样的方式访问它的内容
var mycity = context["destination_city"]
结论 1
即使这确实有效,但如果您正在设置一个解决方案,您将要 manipulate/access Json,我强烈建议为您的数据制作模型以进行序列化和序列化,为此,查看Unity的JsonUtility(Json序列化)
解决方案 2:将 C# 对象与 Json
序列化我们以Unity的手册为例:
数据模型Class
首先,我们创建一个 Model
class 我们想要的 Json 信息,在这种情况下,我们想要关于我们玩家的信息,为此我们创建了 3 个字段, int level
、float timeElapsed
和 string playerName
。
[Serializable]
public class MyClass
{
public int level;
public float timeElapsed;
public string playerName;
}
数据初始化
这里我们创建了一个名为 myObject
的 class MyClass
的新实例,并手动设置它的字段值(事实上,您如何设置值在这里并不重要)
MyClass myObject = new MyClass();
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject.playerName = "Dr Charles Francis";
将您的 class 序列化为 Json
要序列化您的 myObject
,只需将其作为参数
JsonUtility
的 .ToJson
方法
string json = JsonUtility.ToJson(myObject);
现在,我们的 class 对象相当于 Json 字符串:
{"level":1,"timeElapsed":47.5,"playerName":"Dr Charles Francis"}
正在从您的 class
生成 Json如果您想用 Json 中的数据填充 C# 对象,您可以通过调用 JsonUtility
的 .FromJson<TypeOfTheClassImMappingTo>
方法并将其传递给 json 字符串作为参数。
myObject = JsonUtility.FromJson<MyClass>(json);
这些只是基本操作,您可以使用 Json 实用程序的 Class/Json 序列化
进行表面处理结论 2
这个解决方案更易于维护。您可以扩展它以使用任意数量的模型类型,并利用 C# 对象的优势和轻松导航。这对于创建将使用您的数据对象的系统特别有趣。
如果您对 Json 实用程序有疑问,例如如何管理数组、嵌套数据等。我强烈建议您花几分钟时间通读