public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var token = reader.TokenType; switch (token) { case JsonToken.String: { AdaptiveFallbackElement adaptiveFallbackElement = new AdaptiveFallbackElement(); string stringValue = (string)reader.Value; if (stringValue == "drop") { adaptiveFallbackElement.Type = AdaptiveFallbackElement.AdaptiveFallbackType.Drop; } else { throw new AdaptiveSerializationException("The only valid string value for the fallback property is 'drop'."); } return(adaptiveFallbackElement); } case JsonToken.StartObject: { var jObject = JObject.Load(reader); var typeName = AdaptiveTypedElementConverter.GetElementTypeName(objectType, jObject); Type type; if (!AdaptiveTypedElementConverter.TypedElementTypes.Value.TryGetValue(typeName, out type)) { type = typeof(AdaptiveUnknownElement); } IsInFallback = true; string objectId = jObject.Value <string>("id"); AdaptiveInternalID internalID = AdaptiveInternalID.Next(); // Handle deserializing unknown element ParseContext.PushElement(objectId, internalID); var result = (AdaptiveTypedElement)Activator.CreateInstance(type); serializer.Populate(jObject.CreateReader(), result); ParseContext.PopElement(); IsInFallback = false; AdaptiveFallbackElement adaptiveFallbackElement = new AdaptiveFallbackElement(); adaptiveFallbackElement.Type = AdaptiveFallbackElement.AdaptiveFallbackType.Content; adaptiveFallbackElement.Content = result; return(adaptiveFallbackElement); } default: { throw new AdaptiveSerializationException("Invalid value for fallback"); } } }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var jObject = JObject.Load(reader); string typeName = GetElementTypeName(objectType, jObject); if (TypedElementTypes.Value.TryGetValue(typeName, out var type)) { string objectId = jObject.Value <string>("id"); if (objectId == null) { if (typeof(AdaptiveInput).GetTypeInfo().IsAssignableFrom(type.GetTypeInfo())) { throw new AdaptiveSerializationException($"Required property 'id' not found on '{typeName}'"); } } // add id of element to ParseContext AdaptiveInternalID internalID = AdaptiveInternalID.Current(); if (type != typeof(AdaptiveCard)) { internalID = AdaptiveInternalID.Next(); ParseContext.PushElement(objectId, internalID); } var result = (AdaptiveTypedElement)Activator.CreateInstance(type); try { serializer.Populate(jObject.CreateReader(), result); } catch (JsonSerializationException) { } // remove id of element from ParseContext if (type != typeof(AdaptiveCard)) { ParseContext.PopElement(); } HandleAdditionalProperties(result); return(result); } else // We're looking at an unknown element { string objectId = jObject.Value <string>("id"); AdaptiveInternalID internalID = AdaptiveInternalID.Next(); // Handle deserializing unknown element ParseContext.PushElement(objectId, internalID); AdaptiveTypedElement result = null; if (ParseContext.Type == ParseContext.ContextType.Element) { result = (AdaptiveTypedElement)Activator.CreateInstance(typeof(AdaptiveUnknownElement)); serializer.Populate(jObject.CreateReader(), result); } else // ParseContext.Type == ParseContext.ContextType.Action { result = (AdaptiveTypedElement)Activator.CreateInstance(typeof(AdaptiveUnknownAction)); serializer.Populate(jObject.CreateReader(), result); } ParseContext.PopElement(); Warnings.Add(new AdaptiveWarning(-1, $"Unknown element '{typeName}'")); return(result); } }