Recent changes to the supporting LUIS libraries in the Bot Framework have puzzled me. I find that whilst getting the Top Intent from the RecognizerResult recognizerResult?.GetTopScoringIntent();
is easy, getting hold of an Entity seems very strange. I’m not sure if it’s my SDK, LUIS models or what, but this is the code I’m currently having to use…and I confess I still find it all very odd [Edit 20-Nov-2018] Code changed to better cope with arrays coming and going :s;
public static T GetEntity<T>(this RecognizerResult luisResult, string entityKey, string valuePropertyName = "text") { if (luisResult != null) { //// var value = (luisResult.Entities["$instance"][entityKey][0]["text"] as JValue).Value; var data = luisResult.Entities as IDictionary<string, JToken>; if (data.TryGetValue("$instance", out JToken value)) { var entities = value as IDictionary<string, JToken>; if (entities.TryGetValue(entityKey, out JToken targetEntity)) { var entityArray = targetEntity as JArray; if (entityArray.Count > 0) { var values = entityArray[0] as IDictionary<string, JToken>; if (values.TryGetValue(valuePropertyName, out JToken textValue)) { var text = textValue as JValue; if (text != null) { return (T)text.Value; } } } } } } return default(T); }
Hope it helps