@sergeyiljin
Делаю дело

Как с помошью System.Text.Json пройтись по всему Json дереву и удалить пустых детей?

Нужно сделать универсальный метод удаления пустых Json фрагментов в переданном Json. К примеру, свойства с пустым массивом, строкой или null должны быть удалены на всех уровнях вложенности. В результате нужно вернуть только целостный Json с заполненными значениями. Как это сделать встроенными средствами System.Text.Json?
  • Вопрос задан
  • 76 просмотров
Решения вопроса 1
ayazer
@ayazer
Sr. Software Engineer
максимально отвратительное решение если честно. но формально - задачу выполняет. на случай если не выйдет донести что с ньютонсофтом тут жизнь будет проще. только допишите для всех остальных типов, я только набросал идею

static void Main(string[] args)
        {
            var obj = new
            {
                a = new { },
                b = new
                {
                    c = new { },
                    d = new
                    {
                        val = 1,
                        val2 = new int[0],
                        val3 = (object)null
                    }
                },
                c = new
                {
                    d = new
                    {
                        val = string.Empty,
                        val2 = "sratrt",
                        val3 = new[] {1,2,3,4,5}
                    }
                }
            };

            var json = JsonSerializer.Serialize(obj);

            var result = RemoveEmptyValues(json);
             //{"a":{},"b":{"c":{},"d":{"val":1}},"c":{"d":{"val2":"sratrt","val3":[1,2,3,4,5]}}}


        }

        private static string RemoveEmptyValues(string jsonString)
        {
            var jsonDoc = JsonDocument.Parse(jsonString);

            dynamic dynObject = new ExpandoObject();

            Iterate(jsonDoc.RootElement, dynObject);

            return JsonSerializer.Serialize(dynObject);
        }

        private static void Iterate(JsonElement doc, IDictionary<string, object> result)
        {
            foreach (var node in doc.EnumerateObject())
            {
                if (node.Value is JsonElement jDoc)
                {
                    if (node.Value.ValueKind == JsonValueKind.Object)
                    {
                        var nodeContent = new ExpandoObject();

                        result.Add(node.Name, nodeContent);

                        Iterate(jDoc, nodeContent);
                    }
                    else if (node.Value.ValueKind == JsonValueKind.Number)
                    {
                        var value = node.Value.GetInt64();
                        result.Add(node.Name, value);
                    }
                    else if (node.Value.ValueKind == JsonValueKind.Array)
                    {
                        if (node.Value.GetArrayLength() != 0)
                        {
                            var array = new List<object>();

                            foreach (var item in node.Value.EnumerateArray())
                            {
                                array.Add(item);
                            }

                            result.Add(node.Name, array);
                        }
                    }
                    else if (node.Value.ValueKind == JsonValueKind.String)
                    {
                        var value = node.Value.GetString();
                        if (!string.IsNullOrEmpty(value){
                            result.Add(node.Name, value);
                        }
                    }
                    else if (node.Value.ValueKind == JsonValueKind.Null)
                    {

                    }
                    else
                    {
                        throw new NotImplementedException($"Unexpected json value type {node.Value.ValueKind}");
                    }
                }
            }


        }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vabka Куратор тега C#
Токсичный
В System.Text.Json нет DOM-апи, как в Newtonsoft.
Берите Newtonsoft.Json
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
НПК «Катрен» Новосибирск
от 90 000 ₽
WB—Tech Москва
от 140 000 до 160 000 ₽
от 3 500 до 4 000 $
07 мар. 2021, в 23:34
5000 руб./за проект
07 мар. 2021, в 23:14
10000 руб./за проект