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