С# Web API JSon объединяет объекты в одно свойство

Я работаю над веб-API на С# и получаю данные из базы данных SQL. Когда я помещаю один номер студента в вызов GET, их данные возвращаются правильно, однако, если у них есть две строки в запросе SQL, то Return в вызове GET показывает их данные в двух отдельных свойствах. Есть ли способ объединить объекты списка для пользователя, у которого есть две разные строки данных, в один возврат. Например, приведенный ниже пользователь принадлежит к двум отделам (политика и религия), и когда я вызываю метод GET, они появляются дважды, по одному разу для каждого отдела;

{
    "roles": [
        [
            "STUDENT",
            "UG",
            2,
            "Politics",
            "Smith, John",
            123456
        ],
        [
            "STUDENT",
            "UG",
            2,
            "Religions",
            "Smith, John",
            123456
        ]
    ]
}

Вот что я хотел бы вернуть;

{
    "roles": [
        [
            "STUDENT",
            "UG",
            2,
            "Politics",
            "Religions",
            "Smith, John",
            123456
        ]
    ]
}

Я извлекаю данные из базы данных SQL Server с помощью запроса и создал список, в который я добавляю данные из запроса в виде объектов. Когда я ищу студента, используя его идентификатор, и если у него два разных отдела, я бы хотел, чтобы два свойства возвращались как одно.

Я попытался сделать следующее, но это все, что у меня получилось;

int howmanyrecords = studentList.Count;
            if (howmanyrecords >1)
            {

                foreach(Object stu in studentList)
                {

                    var firstObject = studentList.ElementAt(0);
                }
            }

Вышеупомянутый studentList.ElementAt(0) извлекает первый экземпляр в studentList, т. е. запись, в которой «Политика» является отделом, но я не уверен, как завершить вышеизложенное и как объединиться в один объект — моя первоначальная мысль заключалась в том, чтобы сравните все индексы обоих объектов и, если они разные, добавьте значение в индексе X из объекта2 в объект1.

Любые указатели будут оценены.

Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Разница между Angular и React
Разница между Angular и React
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые...
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
0
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот код вы хотите

    var jObj = JObject.Parse(json);
    var roles = (JArray)jObj["roles"];
    if (roles.Count() > 1)
    {
        jObj["roles"] = new JArray(roles[0].Union(roles[1]));
        json = jObj.ToString();
    }

ИМХО этот код вам нужен

    if (roles.Count() > 1)
    {
        for (int i = 0; i < roles[0].Count(); i++)
        {
            if (roles[0][i].ToString() != roles[1][i].ToString())
            {
                var arr = new JArray();
                arr.Add(roles[0][i]);
                arr.Add(roles[1][i]);
                roles[0][i] = arr;
            }
        }
        roles[1].Remove();
        json = jObj.ToString();
    }

Выход

{
  "roles": [
    [
      "STUDENT",
      "UG",
      2,
      [
        "Politics",
        "Religions"
      ],
      "Smith, John",
      123456
    ]
  ]

ОБНОВЛЯТЬ

Это будет работать для любого количества студентов

    var jObj = JObject.Parse(json);
    var roles = (JArray)jObj["roles"];

    if (roles.Count() > 1)
    {
        for (int j = 0; j < roles[0].Count(); j++)
        {
            var jArr = new JArray();
            for (var i = 1; i < roles.Count(); i++)
            {
                if (i == 1) jArr = new JArray { roles[0][j] };
                jArr.Add(roles[i][j]);
            }
            var arr = jArr.Distinct();
if (arr.Count() > 1) roles[0][j] = new JArray(arr); // ["Politics", "Religions"]

 //or if you dont  want an array
 if (arr.Count() > 1) roles[0][j] = string.Join(",", arr); // "Politics,Religions"
        }

        var c = roles.Count();
        for (var i = c - 1; i > 0; i--)
            roles[i].Remove();
            
        json = jObj.ToString().Dump();
    }

Серж, спасибо, что второй раз за эту неделю пришёл на помощь, ха-ха! Вы становитесь чем-то вроде спасителя! Я попробовал ваше решение, и оно работает, как вы советовали, так что спасибо. Единственный вопрос, который у меня есть, заключается в том, что если у студента более 2 факультетов, скажем, 3 или более, то как лучше всего, по вашему мнению, мне следует реализовать это, поскольку текущее решение работает в предположении, что когда-либо будет только 2 отдела ... что полностью по моей вине, так как я должен был быть более ясным в своем вопросе.

GBM 18.02.2023 10:27

@GBM У меня есть 2 решения. Какое решение работает для вас?

Serge 18.02.2023 13:12

К сожалению, извиняюсь - второе решение - это то, с которым я пошел, и оно работает для меня - спасибо :). Позвольте мне опробовать ваше отредактированное решение для любого количества учащихся. Спасибо, что нашли время помочь Сергею. Ценить это!

GBM 18.02.2023 14:44

@GBM Теперь вам понадобится решение для десериализации его в ваш класс Student. Разместите вопрос, включая студенческий класс, и я отвечу

Serge 18.02.2023 14:47

Привет Серж, как и просили, вопрос теперь размещен здесь - stackoverflow.com/questions/75499269/…

GBM 19.02.2023 10:55

@GBM Сначала вы должны принять этот ответ. Я снова ответил на ваш новый вопрос, так как он не имеет для меня никакого смысла, сначала вы сказали мне, что выбрали второе решение. Вам действительно нужно решить, чего вы хотите, и думать на один шаг вперед. Что вы собираетесь делать после того, как сбросили несколько записей в одну большую кучу мусора? Откуда вы знаете, религиозное ли это, или это отдел или имя?

Serge 19.02.2023 11:39

Религии - это название отдела. В исходном SQL-запросе учащийся извлекается из базы данных с тремя отделами, поскольку он участвует в совместной программе, поэтому он извлекается с тремя отделами. Надеюсь, это имеет больше смысла в новом вопросе, который я опубликовал. Я закрою этот.

GBM 19.02.2023 11:51

@GBM Извините, но это не имеет никакого смысла, иначе вам придется оставить имена свойств, а не только значения, как сейчас, или для того, чтобы определить имя свойства позже, значения должны быть помещены в специальный заказ. При этом, если запись имеет несколько одинаковых свойств, их следует вынести в скобки.

Serge 19.02.2023 11:58

К сожалению, внешняя компания, которая будет извлекать данные из нашего API, очень конкретно указала, как они хотят представлять данные, и мы пытались заставить их понять сложности, связанные с их запросом, но безуспешно. Но не волнуйтесь - я постараюсь разобраться. Большое спасибо за вашу помощь в этом сложном вопросе. Очень признателен.

GBM 19.02.2023 12:03

@GBM Я обновил свой ответ, если вы не хотите, чтобы массив использовал его, если (arr.Count() > 1) roles[0][j] = string.Join(",", arr);

Serge 19.02.2023 13:43

Бинго! Сделано именно то, что я хотел. Вы, сэр, гений! Большое спасибо - я использовал ваш ответ из вашего последнего «ОБНОВЛЕНИЯ» выше! Спасибо Серж :)

GBM 20.02.2023 10:48

Другие вопросы по теме