我正在尝试获取我在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;
}
答案 0 :(得分:2)
使用当前代码,您应该能够使用
访问您的上下文var context = dict["context"] as Dictionary<string, object>
现在你有了上下文,你可以用同样的方式访问它的内容
var mycity = context["destination_city"]
即使这确实有效,如果您要设置一个解决方案,您将要操作/访问Json,我强烈建议您将数据模型进行序列化,为此,请查看Unity的{{3} (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
要序列化您的MyClass myObject = new MyClass();
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject.playerName = "Dr Charles Francis";
,只需将其作为参数传递给myObject
的{{1}}方法
JsonUtility
现在,我们将类的对象等效为Json字符串:
.ToJson
如果要使用Json中的数据填充C#对象,可以通过调用string json = JsonUtility.ToJson(myObject);
的{{1}}方法并将json字符串作为参数传递给它。
{"level":1,"timeElapsed":47.5,"playerName":"Dr Charles Francis"}
这些只是基本操作,可以用JsonUtility的Class / Json序列化来表达
此解决方案更易于维护。您可以将其扩展为使用任意数量的模型类型,并且具有C#对象的导航优势和易用性。创建将使用数据对象的系统特别有趣。
如果您对Json Utility有疑问,比如如何管理数组,嵌套数据等。我强烈建议您花几分钟时间阅读JsonUtility练习。