From 5a483451e6db4dd79dcecec2894572559341c6bf Mon Sep 17 00:00:00 2001 From: "claude[bot]" <41898282+claude[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 06:42:25 +0000 Subject: [PATCH] Add SelectArray and SelectArrayOrThrow methods Add array selection methods following the existing SelectList pattern. Includes JsonHelper static methods, JToken extension methods, and unit tests for both test classes. Co-authored-by: Mihail Vorobyev --- JsonHelper.Net.Test/JTokenExtensionsTests.cs | 19 +++++++++++++ JsonHelper.Net.Test/JsonHelperTests.cs | 19 +++++++++++++ JsonHelper.Net/JTokenExtensions.cs | 22 +++++++++++++++ JsonHelper.Net/JsonHelper.cs | 28 +++++++++++++++++++- 4 files changed, 87 insertions(+), 1 deletion(-) diff --git a/JsonHelper.Net.Test/JTokenExtensionsTests.cs b/JsonHelper.Net.Test/JTokenExtensionsTests.cs index 492142e..59e5d09 100644 --- a/JsonHelper.Net.Test/JTokenExtensionsTests.cs +++ b/JsonHelper.Net.Test/JTokenExtensionsTests.cs @@ -95,6 +95,25 @@ public async Task SelectListWithStringsTest(string json, string path, params str Assert.That(result, Is.EquivalentTo(items)); } /// + /// Array selection test + /// + [TestCase("{\"field\": [\"a\",\"b\",\"c\"]}", "$.field", "a", "b", "c")] + public async Task SelectArrayWithStringsTest(string json, string path, params string[] items) { + await Console.Out.WriteLineAsync(json); + await Console.Out.WriteLineAsync(path); + await Console.Out.WriteLineAsync(items.Length.ToString()); + foreach (var item in items) { + await Console.Out.WriteLineAsync(item); + } + var jtoken = JToken.Parse(json); + var result = jtoken.SelectArray(path); + Assert.That(result, Is.Not.Null); + foreach (var item in result!) { + await Console.Out.WriteLineAsync(item); + } + Assert.That(result, Is.EquivalentTo(items)); + } + /// /// Date selection test /// [TestCase("{\"field\": \"2024-01-05T00:00:00\"}", "$.field", "2024-01-05T00:00:00.0000000")] diff --git a/JsonHelper.Net.Test/JsonHelperTests.cs b/JsonHelper.Net.Test/JsonHelperTests.cs index 040d81e..14af828 100644 --- a/JsonHelper.Net.Test/JsonHelperTests.cs +++ b/JsonHelper.Net.Test/JsonHelperTests.cs @@ -97,6 +97,25 @@ public async Task SelectListWithStringsTest(string json, string path, params str Assert.That(result, Is.EquivalentTo(items)); } /// + /// Array selection test + /// + [TestCase("{\"field\": [\"a\",\"b\",\"c\"]}", "$.field", "a", "b", "c")] + public async Task SelectArrayWithStringsTest(string json, string path, params string[] items) { + await Console.Out.WriteLineAsync(json); + await Console.Out.WriteLineAsync(path); + await Console.Out.WriteLineAsync(items.Length.ToString()); + foreach (var item in items) { + await Console.Out.WriteLineAsync(item); + } + var jtoken = JToken.Parse(json); + var result = JsonHelper.SelectArray(jtoken, path); + Assert.That(result, Is.Not.Null); + foreach (var item in result!) { + await Console.Out.WriteLineAsync(item); + } + Assert.That(result, Is.EquivalentTo(items)); + } + /// /// Date selection test /// [TestCase("{\"field\": \"2024-01-05T00:00:00\"}", "$.field", "2024-01-05T00:00:00.0000000")] diff --git a/JsonHelper.Net/JTokenExtensions.cs b/JsonHelper.Net/JTokenExtensions.cs index ab3bc97..45775f3 100644 --- a/JsonHelper.Net/JTokenExtensions.cs +++ b/JsonHelper.Net/JTokenExtensions.cs @@ -142,6 +142,28 @@ public static List SelectListOrThrow(this JToken json, string path) { return token; } /// + /// Select + /// + /// Initial json token + /// JSON path + /// Resolved + public static T[]? SelectArray(this JToken json, string path) { + return JsonHelper.SelectArray(json, path); + } + /// + /// Select or throw + /// + /// Initial json token + /// JSON path + /// Resolved + public static T[] SelectArrayOrThrow(this JToken json, string path) { + var token = SelectArray(json, path); + if (token == null) { + throw new JsonHelperException("Failed to select JToken: token is null"); + } + return token; + } + /// /// Select /// /// Initial json token diff --git a/JsonHelper.Net/JsonHelper.cs b/JsonHelper.Net/JsonHelper.cs index 94952f3..e6b769b 100644 --- a/JsonHelper.Net/JsonHelper.cs +++ b/JsonHelper.Net/JsonHelper.cs @@ -228,7 +228,33 @@ public static Guid SelectGuidOrThrow(JToken json, string path) { return value.Value; } /// - /// Select + /// Select + /// + /// Initial json token + /// JSON path + /// Resolved + public static T[]? SelectArray(JToken json, string path) { + var token = Select(json, path, JTokenType.Array); + if (token == null) { + return null; + } + return token.ToObject(); + } + /// + /// Select or throw + /// + /// Initial json token + /// JSON path + /// Resolved + public static T[] SelectArrayOrThrow(JToken json, string path) { + var value = SelectArray(json, path); + if (value == null) { + throw new JsonHelperException($"Failed to select an array at {path}"); + } + return value; + } + /// + /// Select /// /// Initial json token /// JSON Path