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; }
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; }
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; }
private NewtonsoftTestModel GetPatchedModel(object patchObject, NewtonsoftTestModel model = null, JsonMergePatchOptions options = null) => GetTestPatch(patchObject, options).ApplyTo(model ?? GetTestModel());
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); } } }
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); }
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>); }
public static JsonMergePatchDocument <TModel> Build <TModel>(JObject jsonObjectPatch, JsonMergePatchOptions options = null) where TModel : class { return(CreatePatchDocument <TModel>(jsonObjectPatch, defaultSerializer, options ?? new JsonMergePatchOptions())); }
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)); }