JSON Merge Patch support for ASP.NET Core
– Morcatko.AspNetCore.JsonMergePatch (ASP.NET Core 2.x)
– Morcatko.AspNetCore.JsonMergePatch.NewtonsoftJson (ASP.NET Core 3+)
– Morcatko.AspNetCore.JsonMergePatch.SystemText (ASP.NET Core 3+)
– Morcatko.AspNetCore.JsonMergePatch.Document (ASP.NET Core 3+ – base package)
JSON Merge Patch
- RFC 7396
- performs partial resource update similar to JSON Patch
- Supports Swagger
- netstandard 2.0
C# object:
var backendModel = new Model() { Name = \"James Bond\" Age = \"45\" Weapon = \"Gun\" }
JSON Merge Patch:
var mergePatch = new object() { \"Weapon\": \"Knife\" }
Resulting C# object:
var newObject = new Model() { Name = \"James Bond\" Age = \"45\" Weapon = \"Knife\" }
How to
See 2.1-testApp, 3.0 testApp or 6.0/testApp for sample
- Install nuget (Use JsonMergePathch version same as your .NET) .
- ASP.NET Core 2.x Morcatko.AspNetCore.JsonMergePatch
- ASP.NET Core 3+ (Newtonsoft.Json) Morcatko.AspNetCore.JsonMergePatch.NewtonsoftJson
- ASP.NET Core 3+ (System.Text) Morcatko.AspNetCore.JsonMergePatch.SystemText nuget
- Add to your startup class
using Morcatko.AspNetCore.JsonMergePatch; public void ConfigureServices(IServiceCollection services) { ... services .AddMvc() // or .AddMvcCore() //.AddJsonMergePatch(); // 2.x //.AddNewtonsoftJsonMergePatch(); // 3+ (Newtonsoft.Josn) //.AddSystemTextJsonMergePatch(); // 3+ (System.Text) ... }
- Use in your controller
using Morcatko.AspNetCore.JsonMergePatch; [HttpPatch] [Consumes(JsonMergePatchDocument.ContentType)] public void Patch([FromBody] JsonMergePatchDocument<Model> patch) { ... patch.ApplyTo(backendModel); ... }
You can apply a patch to a different Type (be carefull, all C# static typing is ignored) – see #16 for more details.
BackendModel backendModel; JsonMergePatch<DtoModel> patch; patch.ApplyToT(backendModel)
- Swagger config (optional)
copy & paste this class into your app
- 2.x – https://g*it*hub.co*m/Morcatko/Morcatko.AspNetCore.JsonMergePatch/blob/master/src/2.1-testApp/JsonMergePatchDocumentOperationFilter.cs
- 3+ – https://*gith**ub.com/Morcatko/Morcatko.AspNetCore.JsonMergePatch/blob/master/src/6.0-testApp/JsonMergePatchDocumentOperationFilter.cs
services.AddSwaggerGen(c => { c.OperationFilter<JsonMergePatchDocumentOperationFilter>(); });
Options
services .AddMvc() .AddJsonMergePatch(o => ....)
- bool EnableDelete – Deletes items when target object is Dictionary and patched value is null
How to – unit testing
See tests in ...Builder.Json.Simple class for more examples
Morcatko.AspNetCore.JsonMergePatch.Tests.Builder.Json public void UnitTest() { var model = new Model(); var patch1 = PatchBuilder.Build<Model>(\"{ integer: 1}\"); ... or ... var original = new Model(); var patched = new Model() { Integer = 1}; var patch2 = PatchBuilder.Build(original, patched); }
Known issues/Not working
- ModelState.IsValid is false when a required property is missing
- Enums with [EnumMember(Value = \”….\”)] attribute
