Morcatko / Morcatko.AspNetCore.JsonMergePatch

JsonMergePatch support for ASP.NET Core
MIT License
87 stars 21 forks source link
asp asp-net-core asp-net-mvc csharp json json-merge-patch

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

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) .

  2. 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) ... }

3. Use in your controller
````csharp
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

Options

services
    .AddMvc()
    .AddJsonMergePatch(o => ....)

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