Problem Statement
We have a nested object. We would like a function where you pass in the object and a key and get back the value.
Example Inputs
Input object = {“a”:{“b”:{“c”:”d”}}}
Input key = a/b/c
Output value = d
Input object = {“x”:{“y”:{“z”:”a”}}}
Input key = x/y
Output value = {“z”:”a”}
Proposed Solution
To achieve this, we can split the key by "/" and check each level of the object. JObject class from the Newtonsoft.Json Nuget package can be used to parse and navigate a JSON object.
This function takes a JObject and a key, splits the key by '/' character, iterate over the keys array and on each iteration, it uses the key to get the value at that key, until it reaches the last key. The value at the last key will be returned and if the key not found, it will return key does not exist.
Source Code
using Newtonsoft.Json.Linq;
using System;
using System.Reflection;
namespace GetNestedValueByKey {
class Program {
static void Main(string[] args) {
static object GetNestedValueByKey(JObject obj, string key) {
var keys = key.Split('/');
JToken current = obj;
foreach(var k in keys) {
current = current[k];
if (current == null) return $ "Key {key} not exists";
}
return current;
}
/*Tests*/
JObject obj = JObject.Parse("{\"a\":{\"b\":{\"c\":\"d\"}}}");
var value = GetNestedValueByKey(obj, "a/b/c");
Console.WriteLine(value); // Output: "d"
obj = JObject.Parse("{\"x\":{\"y\":{\"z\":\"a\"}}}");
value = GetNestedValueByKey(obj, "x/y");
Console.WriteLine(value); // Output: { "z": "a" }
obj = JObject.Parse("{\"x\":{\"y\":{\"z\":\"a\"}}}");
value = GetNestedValueByKey(obj, "x");
Console.WriteLine(value); // Output: { "y": { "z": "a" } }
obj = JObject.Parse("{\"x\":{\"y\":{\"z\":\"a\"}}}");
value = GetNestedValueByKey(obj, "k"); // key not exists in json
Console.WriteLine(value); // Output: Key k not exists
}
}
}
Output