Как реализовать конвертацию многоуровневого JSON к одноуровневому list
Подскажите, пожалуйста, как реализовать приведение многоуровневого JSON к одномерному list с сохранением информации?
Грубо говоря мне нужно записать названия категорий и ссылки в один list.
У меня есть тестовый проект, получил от него вот такой JSON:
{
"id": 4,
"title": "Масла и автохимия",
"link": "/catalogs2/4",
"children": [
{
"id": 41,
"title": "Масла",
"link": "/catalogs2/41",
"children": [
{
"id": 211,
"title": "гидравлические",
"link": "/catalogs2/211"
},
{
"id": 212,
"title": "моторные",
"link": "/catalogs2/212"
},
{
"id": 215,
"title": "трансмиссионные",
"link": "/catalogs2/215"
},
{
"id": 75,
"title": "амортизационные",
"link": "/catalogs2/fluids-amortization"
}
]
},
{
"id": 42,
"title": "Жидкости",
"link": "/catalogs2/42",
"children": [
{
"id": 216,
"title": "AdBlue",
"link": "/catalogs2/216"
},
{
"id": 217,
"title": "охлаждающие",
"link": "/catalogs2/217"
}
]
},
{
"id": 43,
"title": "Присадки",
"link": "/catalogs2/43",
"children": [
{
"id": 220,
"title": "в масла",
"link": "/catalogs2/220"
}
]
},
{
"id": 255,
"title": "Смазки",
"link": "/catalogs2/255"
},
{
"id": 281,
"title": "Уход и очистка",
"link": "/catalogs2/281"
}
]
}
Сейчас я это реализовал тремя циклами, так как максимальная вложенность равна трем. Но меня все волнует вопрос, а что если это значение увеличится, неправильно делать так топорно.
Пришел к решению, что нужно через рекурсию. Но так и не понял как реализовать.
В VS для десериализации JSON я создал класс.
[Serializable]
public class Child
{
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("title")]
public string Title { get; set; }
[JsonProperty("link")]
public string Link { get; set; }
[JsonProperty("children")]
public Child[] Children { get; set; }
}
Результат должен быть таким list<string>:
"Масла и автохимия" || "/catalog/4"
"Масла" || "/catalogs2/41"
"гидравлические" || "/catalog/211"
... [сокращение] ...
"Жидкости" || "/catalog/42"
"AdBlue" || "/catalog/216"
... [и т.д.] ...
Нашел вот такое решение, но не понимать как его адаптировать под мою задачу на C#
Ответы (1 шт):
Есть вариант решения вашей задачи через рекурсию. Пока не смог придумать, как избавиться здесь от рекурсии:
public static string Format(string json)
{
var root = JsonConvert.DeserializeObject<Child>(json);
var items = Unwrap(root);
var sb = new StringBuilder();
foreach (var item in items)
{
sb.AppendLine($"\"{item.Title}\" || \"{item.Link}\"");
}
return sb.ToString();
}
private static List<Child> Unwrap(Child parent)
{
var result = new List<Child> {parent};
if (parent.Children != null)
{
foreach (var child in parent.Children)
{
result.AddRange(Unwrap(child));
}
}
return result;
}
Метод Format() на вход принимает ваш JSON и на выходе возвращает строку, которую вы ожидаете увидеть.