Skip to content

Morcatko/Morcatko.AspNetCore.JsonMergePatch

Repository files navigation

JSON Merge Patch support for ASP.NET Core

Nuget - Morcatko.AspNetCore.JsonMergePatch (ASP.NET Core 2.x)
Nuget - Morcatko.AspNetCore.JsonMergePatch.NewtonsoftJson (ASP.NET Core 3+)
Nuget - Morcatko.AspNetCore.JsonMergePatch.SystemText (ASP.NET Core 3+)
Nuget - 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

  1. Install nuget (Use JsonMergePathch version same as your .NET) .
  1. 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)
    ...
}
  1. 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)
  1. Swagger config (optional)

copy & paste this class into your app

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