如何从Unity中的Watson Conversation Service获取$ context变量?

时间:2018-03-14 11:02:22

标签: c# unity3d ibm-watson watson-conversation watson

我正在尝试获取我在Unity项目中使用Watson Conversation Dialogs创建的上下文变量。我能够在Unity中显示整个JSON对话框,从json文件中获取意图,实体和输出文本。因此,我没有从json文件中获取输出:{text [],而是尝试获取上下文:{variable:从JSON文件中获取值但是我无法理解这些内容。

这是欢迎对话框节点的JSON文件,我想从中读取destination_city变量,将其设置为Unity变量/字符串。

{
   "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 个答案:

答案 0 :(得分:2)

解决方案1:保存代码

使用当前代码,您应该能够使用

访问您的上下文
var context = dict["context"] as Dictionary<string, object>

现在你有了上下文,你可以用同样的方式访问它的内容

var mycity = context["destination_city"]

结论1

即使这确实有效,如果您要设置一个解决方案,您将要操作/访问Json,我强烈建议您将数据模型进行序列化,为此,请查看Unity的{{3} (Json序列化)

解决方案2:将C#对象与Json

串行化

我们来看看Unity的手册示例:

数据模型类

首先,我们创建了一个我们想要的Json信息的Model类,在这种情况下,我们需要有关我们播放器的信息,为此我们创建了3个字段int level,{{1} }和float timeElapsed

string playerName

数据初始化

在这里,我们创建了一个名为[Serializable] public class MyClass { public int level; public float timeElapsed; public string playerName; } 的类MyClass的新实例,并手动设置它的字段值(事实上,这里设置值的方式并不重要)

myObject

将您的类序列化为Json

要序列化您的MyClass myObject = new MyClass(); myObject.level = 1; myObject.timeElapsed = 47.5f; myObject.playerName = "Dr Charles Francis"; ,只需将其作为参数传递给myObject的{​​{1}}方法

JsonUtility

现在,我们将类的对象等效为Json字符串:

.ToJson

从您的班级

生成Json

如果要使用Json中的数据填充C#对象,可以通过调用string json = JsonUtility.ToJson(myObject); 的{​​{1}}方法并将json字符串作为参数传递给它。

{"level":1,"timeElapsed":47.5,"playerName":"Dr Charles Francis"}

这些只是基本操作,可以用JsonUtility的Class / Json序列化来表达

结论2

此解决方案更易于维护。您可以将其扩展为使用任意数量的模型类型,并且具有C#对象的导航优势和易用性。创建将使用数据对象的系统特别有趣。

如果您对Json Utility有疑问,比如如何管理数组,嵌套数据等。我强烈建议您花几分钟时间阅读JsonUtility练习。

Ressources

@Programmers Answer about JsonUtility

[Unity - Manual] JsonUtility / JsonSerialization