using System.Collections.Generic;
using Newtonsoft.Json.Linq;
public static void Main()
{ ""Item_3A1"": ""Desc_3A1"" },
{ ""Item_3A2"": ""Desc_3A2"" },
{ ""Item_3A3"": ""Desc_3A3"" }
{ ""Item_3B1"": ""Desc_3B1"" },
{ ""Item_1"": ""Desc_3B11"" },
{ ""Item_2"": ""Desc_3B12"" },
{ ""Item_3"": ""Desc_3B13"" }
{ ""Item_1"": ""Desc_3B21"" },
{ ""Item_2"": ""Desc_3B22"" },
{ ""Item_3"": ""Desc_3B23"" }
var root = (JContainer)JToken.Parse(json);
var t1 = root.SelectTokens("$.Array3A");
var t2 = root.SelectTokens("$.Array3B.[*].*.[*].Item_1");
var t3 = root.SelectTokens("$.Array3B.[*].Array3B1.[*].*");
var t4 = root.SelectTokens("$.NonExistentNode");
Console.WriteLine($"{MergedAncestry(t1).ToString()}");
Console.WriteLine("------------------------");
Console.WriteLine($"{MergedAncestry(t2).ToString()}");
Console.WriteLine("------------------------");
Console.WriteLine($"{MergedAncestry(t3).ToString()}");
Console.WriteLine("------------------------");
Console.WriteLine($"{MergedAncestry(t4).ToString()}");
static JToken MergedAncestry(IEnumerable<JToken> tokens)
foreach(var token in tokens)
merged = (JObject)GetFullAncestry(token);
merged.Merge((JObject)GetFullAncestry(token), new JsonMergeSettings
MergeArrayHandling = MergeArrayHandling.Union
return merged ?? new JObject();
static JToken GetFullAncestry(JToken node, JToken tree = null)
tree = node?.DeepClone();
if (node?.Parent == null)
return GetFullAncestry(node.Parent, new JArray(tree));
return GetFullAncestry(node.Parent, new JProperty(((JProperty)node.Parent).Name, tree));
return GetFullAncestry(node.Parent, new JObject(tree));