/// <summary> /// Transform specified JSON-object with specified transformation. /// </summary> /// <param name="sourceObject">Source JSON-object.</param> /// <param name="transformationObject">Transformation meta object.</param> /// <param name="transformContext">Transformation context.</param> /// <param name="errorHandler">Error handler.</param> /// <returns>Transformation result object.</returns> internal static JObject Transform( JObject sourceObject, JObject transformationObject, ITransformationInvokeContext transformContext, EventHandler <TransformErrorEventArgs> errorHandler) { var resultObject = (JObject)sourceObject.DeepClone(); var transformations = new Stack <ITransformation>(); transformContext = transformContext ?? new TransformationInvokeContext { Source = sourceObject, }; Walk(transformationObject, transformations); resultObject.Merge(transformationObject, MergeSettings); while (transformations.Count > 0) { var transformation = transformations.Pop(); transformation.OnError += errorHandler; transformation.ApplyTo(resultObject, transformContext); } return(resultObject); }
/// <inheritdoc /> public override void ApplyTo(JObject target, ITransformationInvokeContext context) { var token = target.SelectToken(Context.TargetPath); switch (token) { case JArray array: array.Merge(_argument, MergeSettings); break; default: OnErrorInternal($"\"Add\" transformation for type {token.Type} is not implemented yet."); break; } }
/// <inheritdoc /> public override void ApplyTo(JObject target, ITransformationInvokeContext context) { var token = target.SelectToken(Context.TargetPath); if (token == null) { return; } try { token.Parent.Remove(); } catch (Exception e) { OnErrorInternal($"Error while removing. {e.Message}"); } }
/// <inheritdoc /> public override void ApplyTo(JObject target, ITransformationInvokeContext context) { var copyingToken = context.Source.SelectToken(_sourcePath ?? string.Empty); var targetToken = target.SelectToken(Context.TargetPath); if (copyingToken == null) { OnErrorInternal($"Unable to find node \"{_sourcePath}\" to copy from it."); return; } if (targetToken == null) { OnErrorInternal($"Unable to find node \"{Context.TargetPath}\" to copy there."); return; } targetToken.Replace(copyingToken); }
/// <inheritdoc /> public override void ApplyTo(JObject target, ITransformationInvokeContext context) { if (_transformationObject == null) { OnErrorInternal("Unable to read foreach transformation."); return; } var token = target.SelectToken(Context.TargetPath); if (token is JArray targetArray) { for (var i = 0; i < targetArray.Count; i++) { if (targetArray[i] is JObject targetObject) { // TODO: Analyze errors. var transformedItem = JsonTransformer.Transform( targetObject, (JObject)_transformationObject.DeepClone(), context, (sender, args) => OnItemTransformError(i, args)); targetObject.Replace(transformedItem); } else { OnErrorInternal($"Can not apply ForEach transformation to {Context.TargetPath}. Target item must be a JObject"); } } } else { OnErrorInternal($"Can not apply ForEach transformation to {Context.TargetPath}. Target must be a JObject, but type is {token.Type}"); } }
public override void ApplyTo(JObject target, ITransformationInvokeContext context) { var targetToken = (JValue)target.SelectToken(Context.TargetPath); targetToken.Value = Expected; }
/// <inheritdoc /> public abstract void ApplyTo(JObject target, ITransformationInvokeContext context);