Skip to content

Commit 6bc477c

Browse files
authored
Fix for issue #31, extending the use cases for removing properties via JSON patch. (#32)
* Added GitHub .NET build workflow * Fix for Issue #31 in the original repository. * Test for fix to Issue #31 in the original repository.
1 parent 224de3b commit 6bc477c

File tree

3 files changed

+84
-1
lines changed

3 files changed

+84
-1
lines changed

.github/workflows/dotnetcore.yml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
name: .NET Core
2+
3+
on:
4+
push:
5+
branches: [ master ]
6+
pull_request:
7+
branches: [ master ]
8+
9+
jobs:
10+
build:
11+
12+
runs-on: ubuntu-latest
13+
14+
steps:
15+
- uses: actions/checkout@v2
16+
- name: Setup .NET Core
17+
uses: actions/setup-dotnet@v1
18+
with:
19+
dotnet-version: 3.1.101
20+
- name: Install dependencies
21+
run: dotnet restore
22+
- name: Build
23+
run: dotnet build --configuration Release --no-restore
24+
- name: Test
25+
run: dotnet test --no-restore --verbosity normal

src/3.0-JsonMergePatch.NewtonsoftJson/Builders/PatchBuilder.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ public static JsonMergePatchDocument<TModel> Build<TModel>(TModel original, TMod
2323
=> Build<TModel>(DiffBuilder.Build(original, patched) ?? new JObject(), options);
2424

2525
public static JsonMergePatchDocument<TModel> Build<TModel>(string jsonObjectPatch, JsonSerializerSettings serializerSettings = null, JsonMergePatchOptions options = null) where TModel : class
26-
=> Build<TModel>(JsonConvert.DeserializeObject<JObject>(jsonObjectPatch, serializerSettings), options);
26+
=> CreatePatchDocument<TModel>(
27+
JsonConvert.DeserializeObject<JObject>(jsonObjectPatch, serializerSettings),
28+
serializerSettings != null ? JsonSerializer.Create(serializerSettings) : defaultSerializer,
29+
options ?? new JsonMergePatchOptions()
30+
);
2731

2832
public static JsonMergePatchDocument<TModel> Build<TModel>(object jsonObjectPatch, JsonMergePatchOptions options = null) where TModel : class
2933
=> Build<TModel>(JObject.FromObject(jsonObjectPatch), options);
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using System.Reflection;
2+
using Morcatko.AspNetCore.JsonMergePatch.NewtonsoftJson.Builders;
3+
using Newtonsoft.Json;
4+
using Newtonsoft.Json.Serialization;
5+
using Xunit;
6+
7+
namespace Morcatko.AspNetCore.JsonMergePatch.Tests.NewtonsoftJson.Patching {
8+
public class MyClass
9+
{
10+
[JsonProperty("attributes", Required = Required.DisallowNull, NullValueHandling = NullValueHandling.Ignore)]
11+
public virtual MyAttributes Attributes { get; set; }
12+
}
13+
14+
public class MyAttributes
15+
{
16+
[JsonProperty("name", Required = Required.DisallowNull, NullValueHandling = NullValueHandling.Ignore)]
17+
public virtual string Name { get; set; }
18+
}
19+
20+
// see https://github.com/RicoSuter/NSwag/issues/1991#issuecomment-518600843
21+
class DisallowNullContractResolver : DefaultContractResolver
22+
{
23+
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
24+
{
25+
var jsonProp = base.CreateProperty(member, memberSerialization);
26+
if (jsonProp.Required == Required.DisallowNull)
27+
jsonProp.Required = Required.AllowNull;
28+
return jsonProp;
29+
}
30+
}
31+
32+
public class PropertyRemovalTest {
33+
[Fact]
34+
public void PropertyRemovalWorks() {
35+
var myObj = new MyClass() {
36+
Attributes = new MyAttributes() {
37+
Name = "Test"
38+
}
39+
};
40+
41+
var jsonPatch = @"{
42+
""attributes"": null
43+
}";
44+
45+
var jsonMergePatch = PatchBuilder.Build<MyClass>(
46+
jsonPatch,
47+
new JsonSerializerSettings() { ContractResolver = new DisallowNullContractResolver() },
48+
new JsonMergePatchOptions() { EnableDelete = true });
49+
jsonMergePatch.ApplyTo(myObj);
50+
51+
Assert.Null(myObj.Attributes);
52+
}
53+
}
54+
}

0 commit comments

Comments
 (0)