Сериализация объектов списка в 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;
}
}