Ejemplo n.º 1
0
 private static void AddOperation(JsonMergePatchDocument jsonMergePatchDocument, string pathPrefix,
                                  JObject patchObject, JsonMergePatchOptions options)
 {
     foreach (var jProperty in patchObject)
     {
         var path = pathPrefix + jProperty.Key;
         if (jProperty.Value is JValue jValue)
         {
             if (options.EnableDelete && jValue.Value == null)
             {
                 jsonMergePatchDocument.AddOperation_Remove(path);
             }
             else
             {
                 jsonMergePatchDocument.AddOperation_Replace(path, jValue.Value);
             }
         }
         else if (jProperty.Value is JArray jArray)
         {
             jsonMergePatchDocument.AddOperation_Replace(path, jArray);
         }
         else if (jProperty.Value is JObject jObject)
         {
             jsonMergePatchDocument.AddOperation_Add(path);
             AddOperation(jsonMergePatchDocument, path + "/", jObject, options);
         }
     }
 }
 public SystemTextJsonMergePatchInputFormatter(
     JsonOptions options,
     ILogger <SystemTextJsonInputFormatter> logger,
     Lazy <IModelMetadataProvider> lazyModelMetadataProvider,
     JsonMergePatchOptions jsonMergePatchOptions)
     : base(options, logger)
 {
     SupportedMediaTypes.Clear();
     SupportedMediaTypes.Add(JsonMergePatchMediaType);
     _modelMetadata         = new Lazy <ModelMetadata>(() => lazyModelMetadataProvider.Value.GetMetadataForType(typeof(JsonElement)));
     _jsonMergePatchOptions = jsonMergePatchOptions;
 }
Ejemplo n.º 3
0
        public JsonMergePatchInputFormatter(
            ILogger logger,
            JsonSerializerSettings serializerSettings,
            ArrayPool <char> charPool,
            ObjectPoolProvider objectPoolProvider,
            JsonMergePatchOptions options)
            : base(logger, serializerSettings, charPool, objectPoolProvider)
        {
            this._charPool = new JsonArrayPool <char>(charPool);

            SupportedMediaTypes.Clear();
            SupportedMediaTypes.Add(JsonMergePatchMediaType);
            this._options = options;
        }
Ejemplo n.º 4
0
 public NewtonsoftJsonMergePatchInputFormatter(
     ILogger logger,
     JsonSerializerSettings serializerSettings,
     ArrayPool <char> charPool,
     ObjectPoolProvider objectPoolProvider,
     MvcOptions mvcOptions,
     MvcNewtonsoftJsonOptions jsonOptions,
     Lazy <IModelMetadataProvider> lazyModelMetadataProvider,
     JsonMergePatchOptions jsonMergePatchOptions)
     : base(logger, serializerSettings, charPool, objectPoolProvider, mvcOptions, jsonOptions)
 {
     SupportedMediaTypes.Clear();
     SupportedMediaTypes.Add(JsonMergePatchMediaType);
     _modelMetadata         = new Lazy <ModelMetadata>(() => lazyModelMetadataProvider.Value.GetMetadataForType(typeof(JContainer)));
     _jsonMergePatchOptions = jsonMergePatchOptions;
 }
Ejemplo n.º 5
0
 private NewtonsoftTestModel GetPatchedModel(object patchObject, NewtonsoftTestModel model = null, JsonMergePatchOptions options = null)
 => GetTestPatch(patchObject, options).ApplyTo(model ?? GetTestModel());
Ejemplo n.º 6
0
 private JsonMergePatchDocument <NewtonsoftTestModel> GetTestPatch(object patchObject, JsonMergePatchOptions options = null)
 => PatchBuilder.Build <NewtonsoftTestModel>(patchObject, options);
        internal static IInternalJsonMergePatchDocument CreatePatchDocument(Type modelType, JsonElement jsonElement, JsonSerializerOptions jsonOptions, JsonMergePatchOptions mergePatchOptions)
        {
            var jsonMergePatchType = internalJsonMergePatchDocumentType.MakeGenericType(modelType);
            var json  = jsonElement.GetRawText();
            var model = JsonSerializer.Deserialize(json, modelType, jsonOptions);

            var jsonMergePatchDocument = (IInternalJsonMergePatchDocument)Activator.CreateInstance(jsonMergePatchType, BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { model }, null);

            AddOperation(jsonMergePatchDocument, "/", jsonElement, mergePatchOptions);
            return(jsonMergePatchDocument);
        }
        private static void AddOperation(IInternalJsonMergePatchDocument jsonMergePatchDocument, string pathPrefix, JsonElement jsonElement, JsonMergePatchOptions options)
        {
            var enumerator = jsonElement.EnumerateObject();

            while (enumerator.MoveNext())
            {
                var jsonProp  = enumerator.Current;
                var jsonValue = jsonProp.Value;
                var path      = pathPrefix + jsonProp.Name;
                if (jsonValue.ValueKind.IsValue() || (jsonValue.ValueKind == JsonValueKind.Null))
                {
                    if (options.EnableDelete && (jsonValue.ValueKind == JsonValueKind.Null))
                    {
                        jsonMergePatchDocument.AddOperation_Remove(path);
                    }
                    else
                    {
                        jsonMergePatchDocument.AddOperation_Replace(path, jsonValue.ToObject());
                    }
                }
                else if (jsonValue.ValueKind == JsonValueKind.Array)
                {
                    jsonMergePatchDocument.AddOperation_Replace(path, jsonValue.ToObject());
                }
                else if (jsonValue.ValueKind == JsonValueKind.Object)
                {
                    jsonMergePatchDocument.AddOperation_Add(path);
                    AddOperation(jsonMergePatchDocument, path + "/", jsonValue, options);
                }
            }
        }
Ejemplo n.º 9
0
        internal static JsonMergePatchDocument CreatePatchDocument(Type jsonMergePatchType, Type modelType,
                                                                   JObject patchObject, JsonSerializer jsonSerializer, JsonMergePatchOptions options)
        {
            var model = patchObject.ToObject(modelType, jsonSerializer);
            var jsonMergePatchDocument = (JsonMergePatchDocument)Activator.CreateInstance(jsonMergePatchType,
                                                                                          BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { model }, null);

            AddOperation(jsonMergePatchDocument, "/", patchObject, options);
            return(jsonMergePatchDocument);
        }
Ejemplo n.º 10
0
 private static JsonMergePatchDocument <TModel> CreatePatchDocument <TModel>(JObject patchObject,
                                                                             JsonSerializer jsonSerializer, JsonMergePatchOptions options) where TModel : class
 {
     return(CreatePatchDocument(typeof(JsonMergePatchDocument <TModel>), typeof(TModel), patchObject,
                                jsonSerializer, options) as JsonMergePatchDocument <TModel>);
 }
Ejemplo n.º 11
0
 public static JsonMergePatchDocument <TModel> Build <TModel>(JObject jsonObjectPatch,
                                                              JsonMergePatchOptions options = null) where TModel : class
 {
     return(CreatePatchDocument <TModel>(jsonObjectPatch, defaultSerializer,
                                         options ?? new JsonMergePatchOptions()));
 }
Ejemplo n.º 12
0
 public static JsonMergePatchDocument <TModel> Build <TModel>(TModel original, TModel patched,
                                                              JsonMergePatchOptions options = null) where TModel : class
 {
     return(Build <TModel>(DiffBuilder.Build(original, patched) ?? new JObject(), options));
 }