Как создать массив JSON из строк SQL в C# (функция Azure)

Я создаю API, извлекающий данные из Azure SQL, и хочу создать массив JSON.

В настоящее время у меня есть функция Azure, написанная на C#.

Пример данных выглядит следующим образом:

Я хотел бы, чтобы вывод выглядел так

Моя функция Azure работает нормально, мне просто нужно создать массив. (Я думаю)

            await connection.OpenAsync();
            SqlDataReader dataReader = await command.ExecuteReaderAsync();

            var r = Serialize(dataReader);
            json = JsonConvert.SerializeObject(r, Formatting.Indented);

Я новичок в .NET и не знаю, с чего начать. Спасибо!

Как выглядит ваш текущий результат (переменная json)? Что делает Serialize()? Какой тип r?

Good Night Nerd Pride 11.02.2023 13:19

«Моя функция Azure работает нормально». Где находится эта функция и что такое выходные данные? И, пожалуйста, замените все изображения текстом, если вам нужна помощь.

Serge 11.02.2023 13:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы могли бы сделать это таким образом. Считайте данные в тип, который затем можно использовать LINQ для группировки в желаемую форму, а затем сериализовать в JSON.

//Start with a list of the raw data by reading the rows into CardData list
List<CardData> cards = new List<CardData>();

while (dataReader.Read())
{
    //You should check for DBNull, this example not doing that
    cards.Add(new CardData
    {
        card_key = dataReader.GetString(0),
        card_name = dataReader.GetString(1),
        card_network = dataReader.GetString(2),
        annual_fee = dataReader.GetDecimal(3),
        speed_bonus_category = dataReader.GetString(4),
        speed_bonus_amount = dataReader.GetInt32(5)
    });
}

//Now transform the data into an object graph that will serialize 
//to json the way you want. (flattens the redundant data)

var grp = cards.GroupBy(x => new { x.card_key, x.card_name, x.card_network, x.annual_fee });

var groupedData = new List<CardsModel>();

groupedData = grp.Select(g => new CardsModel
{
    card_key = g.Key.card_key,
    card_name = g.Key.card_name,
    card_network = g.Key.card_network,
    annual_fee = g.Key.annual_fee,
    Bonuses = g.Select(b => new SpeedBonus
    {
        SpeedBonusCategory = b.speed_bonus_category,
        SpeedBonusAmount = b.speed_bonus_amount
    }).ToList()
}).ToList();

//Finally you can serialize
var json = JsonConvert.SerializeObject(groupedData, Formatting.Indented);

Вот вспомогательные классы, которые вы могли бы использовать:

//represents the non-redundant object graph
public class CardsModel
{
    public string card_key { get; set; }
    public string card_name { get; set; }
    public string card_network { get; set; }
    public decimal annual_fee { get; set; }
    public List<SpeedBonus> Bonuses { get; set; }
}

public class SpeedBonus
{
    public string SpeedBonusCategory { get; set; }
    public int SpeedBonusAmount { get; set; }
}

//represents raw data, has redundant cc info
public class CardData
{
    public string card_key { get; set; }
    public string card_name { get; set; }
    public string card_network { get; set; }
    public decimal annual_fee { get; set; }
    public string speed_bonus_category { get; set; }
    public int speed_bonus_amount { get; set; }
}

Замечательно! на реализацию у меня ушло восемь минут!

Jesse O 11.02.2023 16:09

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