Сериализация объектов списка в JSON с использованием C#

Мне нужно несколько советов о том, как импортировать данные в несколько объектов списков с помощью Dapper, а затем сериализовать списки в правильный формат JSON. Пожалуйста, поделитесь своими предложениями. СПАСИБО!

1. Пример формата JSON

{
  "students": [
    {
      "studentId": "",
      "emailAddresses": [
        {
          "emailAddress": ""
        }
      ],      
      "lastName": "",
      "directory": {
        "addresses": [
          {
            "city": "",
            "state": ""
          }
        ],      
      }     
    }
  ]
}

2. Классы

public class Student
{
    public string StudentId { get; set; }
    public string Gender { get; set; }  
    public List<EmailAddresses> emailAddresses { get; set; }
}

public class EmailAddresses
{
    public string EmailAddress { get; set; }    
}

3. Данные поступают из SQL-запроса

StudentId   Gender  EmailAddress
123456  Female  maryjoe@gmail.com
123456  Female  mary.joe@mycollege.edu
123456  Female  mj@hotmail.com

4. Дампер код, который я пытаюсь реализовать

 public List<Student> GetStudentData()
 {
     List<Student> dataStudent;
     using (IDbConnection connection = RepositoryHelper.OpenConnection())
     {
         dataStudent = connection.Query<Student, EmailAddresses, Student>("mystoredprocedure",
            (c, cc) =>
            {
                c.EmailAddresses = cc;
                return c;
            }, splitOn: "EmailAddress").ToList();

        }

    return dataStudent;
}

4. Сериализация в JSON

static void Main(string[] args)
{            
    List<Student> students = GetStudentData();
    var json = new System.Web.Script.Serialization.JavaScriptSerializer()
                                                  .Serialize(students);
}

1 ответ

Решение

Первая проблема заключается в том, что вы вызываете хранимую процедуру, не указывая, что тип команды является хранимой процедурой. Это приведет к неверному переводу вашего имени процесса в команду sql, которая, очевидно, потерпит неудачу.

Однако, основываясь на вашем обновленном комментарии, вторая проблема заключается в том, что вы неправильно используете функциональность dapper multi mapper. Эта функция предназначена для отображения нескольких таблиц на несколько объектов. Однако кажется, что ваша хранимая процедура дает вам плоский объект, и вам нужно разбить уникальные записи на основе идентификатора студента, сопоставив адреса электронной почты со свойством адреса электронной почты.

Dynamic работает очень хорошо для этого, так как мы можем отобразить данные на лету.

public List<Student> GetStudentData()
{
    List<Student> dataStudent;
    using (IDbConnection connection = RepositoryHelper.OpenConnection())
    {
        dataStudent = connection.Query<dynamic>(
            "mystoredprocedure", 
            commandType: CommandType.StoredProcedure)
                .GroupBy(x => x.StudentId)
                .Select(x => new Student 
                    { 
                        StudentId = x.First().StudentId, 
                        Gender = x.First().Gender,
                        emailAddresses = x.Select(ea => new EmailAddresses 
                            { 
                                EmailAddress = ea.emailAddresses 
                            }).ToList()
                    }).ToList();

        return dataStudent;
    }
}
Другие вопросы по тегам