C# 如何从Unity中的Watson对话服务获取$context变量?

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,

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

这是welcome dialog节点的JSON文件,我想从中读取目的地城市变量,将其设置为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;
     }
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);