protected override void Add(AddOperation operation, JToken target)
        {
            JToken  token        = null;
            JObject parenttoken  = null;
            var     parentPath   = operation.Path.ParentPointer.ToString();
            int     index        = parentPath == "/" ? parentPath.Length : parentPath.Length + 1;
            var     propertyName = operation.Path.ToString().Substring(index);

            try
            {
                var  parentArray  = operation.Path.ParentPointer.Find(target) as JArray;
                bool isNewPointer = operation.Path.IsNewPointer();
                if (parentArray == null || isNewPointer)
                {
                    if (isNewPointer)
                    {
                        var parentPointer = operation.Path.ParentPointer;
                        token = parentPointer.Find(target) as JArray;
                    }
                    else
                    {
                        token = operation.Path.Find(target);
                    }
                }
                else
                {
                    parentArray.Insert(int.Parse(propertyName), operation.Value);
                    return;
                }
            }
            catch (ArgumentException)
            {
                var parentPointer = operation.Path.ParentPointer;
                parenttoken = parentPointer.Find(target) as JObject;
            }

            if (token == null && parenttoken != null)
            {
                parenttoken.Add(propertyName, operation.Value);
            }
            else if (token is JArray)
            {
                var array = token as JArray;

                array.Add(operation.Value);
            }
            else if (token.Parent is JProperty)
            {
                var prop = token.Parent as JProperty;
                prop.Value = operation.Value;
            }
        }
        protected override void Add(AddOperation operation, JToken target)
        {
            JToken  token        = null;
            JObject parenttoken  = null;
            var     propertyName = operation.Path.ToString().Split('/').LastOrDefault();

            try
            {
                var parentArray = operation.Path.ParentPointer.Find(target) as JArray;

                if (parentArray == null || propertyName == "-")
                {
                    if (operation.Path.IsNewPointer())
                    {
                        var parentPointer = operation.Path.ParentPointer;
                        token = parentPointer.Find(target) as JArray;
                    }
                    else
                    {
                        token = operation.Path.Find(target);
                    }
                }
                else
                {
                    parentArray.Insert(int.Parse(propertyName), operation.Value);
                    return;
                }
            }
            catch (ArgumentException)
            {
                var parentPointer = operation.Path.ParentPointer;
                parenttoken = parentPointer.Find(target) as JObject;
            }

            if (token == null && parenttoken != null)
            {
                parenttoken.Add(propertyName, operation.Value);
            }
            else if (token is JArray)
            {
                var array = token as JArray;

                array.Add(operation.Value);
            }
            else if (token.Parent is JProperty)
            {
                var prop = token.Parent as JProperty;
                prop.Value = operation.Value;
            }
        }