private VolumeDescription GetVolumeDescription( JsonSerializer serializer, JObject jObject, Dictionary <int, Func <string, VolumeDescription> > volumeDescriptionCreator, string defaultVolumeName) { JToken jToken; if (!jObject.TryGetValue("kind", out jToken)) { return(null); } var provider = jToken.Value <int>(); Func <string, VolumeDescription> creator; if (!volumeDescriptionCreator.TryGetValue(provider, out creator)) { return(null); } VolumeDescription volumeDescription = creator(defaultVolumeName); serializer.Populate(jObject.CreateReader(), volumeDescription); return(volumeDescription); }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var properties = JObject.Load(reader); var isIndependentVolumeMount = typeof(IndependentVolumeMount).IsAssignableFrom(objectType); var isApplicationScopedVolume = typeof(ApplicationScopedVolume).IsAssignableFrom(objectType); if (!(isIndependentVolumeMount || isApplicationScopedVolume)) { throw new JsonSerializationException( String.Format( "Deserialization failure. Expected object of type {0} or {1}, but found object of type {2} instead.", typeof(IndependentVolumeMount), typeof(ApplicationScopedVolume), objectType)); } string volumeDescriptionPropertyName = isIndependentVolumeMount ? "volumeDescription" : "creationParameters"; var name = this.GetPropertyValueSafe <string>(properties, "name"); var readOnly = this.GetPropertyValueSafe <bool>(properties, "readOnly"); var destinationPath = this.GetPropertyValueSafe <string>(properties, "destinationPath"); VolumeDescription volumeDescription = null; JObject volumeDescriptionJObject = null; JToken volumeDescriptionJToken = null; if (properties.TryGetValue(volumeDescriptionPropertyName, out volumeDescriptionJToken)) { volumeDescriptionJObject = volumeDescriptionJToken as JObject; } if (volumeDescriptionJObject != null) { volumeDescription = this.GetVolumeDescription( serializer, volumeDescriptionJObject, isIndependentVolumeMount ? IndependentVolumeDescriptionCreator : ApplicationScopedVolumeDescriptionCreator, isIndependentVolumeMount ? null : name); } return(isIndependentVolumeMount ? (VolumeMount)(new IndependentVolumeMount( name, destinationPath, readOnly, volumeDescription)) : (VolumeMount)(new ApplicationScopedVolume( name, destinationPath, readOnly, volumeDescription))); }