If your data is discreet & in the particular format above then you could use GroupBy
/ ToDictionary
which serialises well with System.Text.Json
out of the box:
using System.Text.Json;
string[][] tableRows = new[] {
new [] { "Prod", "server1", "azure" },
new [] { "Prod", "server2", "azure" },
new [] { "Prod", "server3", "azure" },
new [] { "Prod", "server10", "azure" },
new [] { "Prod", "server11", "aws" },
new [] { "Prod", "server4", "aws" },
new [] { "Prod", "server5", "azure" },
new [] { "Test", "server10", "aws" },
new [] { "Test", "server1", "aws" },
new [] { "Test", "server12", "aws" }
};
var results = tableRows.GroupBy(r => r[0]) /* 0 = Environment */
.ToDictionary(g => g.Key,
r => r.GroupBy(r => r[2]) /* 2 = Cloud provider */
.ToDictionary(g => g.Key,
g => g.Select(r => r[1]) /* 1 = Server name */
)
);
string json = JsonSerializer.Serialize(results, new JsonSerializerOptions { WriteIndented = true });
Console.WriteLine(json);
Produces:
{
"Prod": {
"azure": [
"server1",
"server2",
"server3",
"server10",
"server5"
],
"aws": [
"server11",
"server4"
]
},
"Test": {
"aws": [
"server10",
"server1",
"server12"
]
}
}