代码之家  ›  专栏  ›  技术社区  ›  grunter-hokage

如何从Unity中的Watson对话服务获取$上下文变量?

  •  1
  • grunter-hokage  · 技术社区  · 6 年前

    我正在尝试获取我在Unity项目的Watson对话对话框中创建的上下文变量。我能够让整个JSON对话框统一显示,从JSON文件中获取意图、实体和输出文本。因此,我没有从json文件中获取输出:{text[],而是试图从json文件中获取上下文:{variable:value,但我不知道该怎么做。

    这是欢迎对话框节点的JSON文件,我想从中读取destination\u 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 回复  |  直到 6 年前
        1
  •  2
  •   Antry    6 年前

    解决方案1:保留代码

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

    var context = dict["context"] as Dictionary<string, object>
    

    现在您已经有了上下文,可以以相同的方式访问它的内容

    var mycity = context["destination_city"]
    

    结论1

    尽管这确实可行,但如果您正在设置一个要操作/访问Json的解决方案,我强烈建议您创建数据模型,以便与之进行序列化,为此,请查看Unity的 JsonUtility (Json序列化)

    解决方案2:在Json之间序列化C#对象

    让我们以Unity的手册为例:

    数据模型类

    首先,我们创建 Model 我们想要的Json信息类,在本例中,我们想要关于我们的播放器的信息,为此我们创建了3个字段, int level ,则, float timeElapsed string playerName

    [Serializable]
    public class MyClass
    {
        public int level;
        public float timeElapsed;
        public string playerName;
    }
    

    数据初始化

    在这里,我们创建一个类的新实例 MyClass 调用 myObject 并手动设置字段值(实际上,如何设置值在这里并不重要)

    MyClass myObject = new MyClass();
    myObject.level = 1;
    myObject.timeElapsed = 47.5f;
    myObject.playerName = "Dr Charles Francis";
    

    将类序列化为Json

    要序列化 myObject(我的对象) 把它传给 JsonUtility .ToJson 方法作为参数

    string json = JsonUtility.ToJson(myObject);
    

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

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

    从类生成Json

    如果要用Json中的数据填充C#对象,可以通过调用 J实用性 .FromJson<TypeOfTheClassImMappingTo> 方法,并将json字符串作为参数传递给它。

    myObject = JsonUtility.FromJson<MyClass>(json);
    

    这些仅仅是基本操作,也是您可以使用JsonUtility的类/Json序列化所做的表面操作

    结论2

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

    如果您对Json实用程序有疑问,例如如何管理数组、嵌套数据等。。我强烈建议花几分钟时间通读一遍 @Programmers Answer about JsonUtility 实践。

    资源

    [Unity - Manual] JsonUtility / JsonSerialization

    [StackOverflow] Serialize and Deserialize Json and Json Array in Unity