diff --git a/JsonMasking.Tests/JsonMaskingTests.cs b/JsonMasking.Tests/JsonMaskingTests.cs index d21bd49..fd9c14e 100644 --- a/JsonMasking.Tests/JsonMaskingTests.cs +++ b/JsonMasking.Tests/JsonMaskingTests.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Nodes; +using Newtonsoft.Json.Linq; using Xunit; namespace JsonMasking.Tests @@ -334,6 +335,39 @@ public static void MaskFields_Should_Mask_Partial_With_Single_Field() Assert.Equal(EXPECTED_VALUE, result.Replace("\r\n", "\n")); } + + [Fact] + public static void MaskFields_Should_Mask_With_Array() + { + // arrange + const string EXPECTED_VALUE = "[{\n \"Test\": \"1\",\n \"Card\": {\n \"Number\": \"462294*****9865\",\n \"Password\": \"somepass#here2\"\n }\n}]"; + + var blacklistPartialMock = BlacklistPartialMock.DefaultBlackListPartial; + + var obj = new + { + Test = "1", + Card = new + { + Number = "4622943127049865", + Password = "somepass#here2" + } + }; + + var arr = new object[1] { obj }; + + var json = JsonSerializer.Serialize(arr, IndentedOptions); + string[] blacklist = { "*card.number" }; + var mask = "----"; + + // act + var result = json.MaskFields(blacklist, mask, blacklistPartialMock); + + // assert + Assert.True(JToken.DeepEquals(JToken.Parse(EXPECTED_VALUE), JToken.Parse(result))); + } + + [Fact] public static void MaskFields_Should_Mask_Partial_And_Completely_With_Single_Field() { diff --git a/JsonMasking/JsonMasking.cs b/JsonMasking/JsonMasking.cs index 19fa802..f3fdd3b 100644 --- a/JsonMasking/JsonMasking.cs +++ b/JsonMasking/JsonMasking.cs @@ -43,22 +43,15 @@ public static string MaskFields(this string json, string[] blacklist, string mas { for (int i = 0; i < jsonArray.Count; i++) { - MaskFieldsFromJsonNode(jsonArray[i], blacklist, mask, i.ToString()); + JsonNode jsonNode = jsonArray[i]; + MaskFieldsFromJsonNode(jsonNode, blacklist, mask, blacklistPartial, i.ToString()); } return deserializedObject.ToString(); } var jsonObject = deserializedObject.AsObject(); - - if (blacklistPartial != null) - { - MaskFieldsFromJsonNode(jsonObject, blacklist, mask, blacklistPartial, ""); - } - else - { - MaskFieldsFromJsonNode(jsonObject, blacklist, mask, ""); - } + MaskFieldsFromJsonNode(jsonObject, blacklist, mask, blacklistPartial, ""); return jsonObject.ToString(); } @@ -126,6 +119,11 @@ private static void MaskFieldsFromJsonNode(JsonNode node, string[] blacklist, st return; // abort recursive } + if (blacklistPartial == null) + { + blacklistPartial = new Dictionary>(); + } + if (node is JsonObject jsonObject) { var propertiesToMask = new List<(string key, string path)>();