#c# #automapper
Вопрос:
Привет, у меня есть такой JSON
{
"assessments":[
{
"deliveryTeamName":"Reporting Team",
"programIncrementId":"125",
"programIncrementName":"1",
"sprintId":"558",
"sprintName":"1",
"isDeleted":false,
"created":"2018-04-24T08:39:19",
"createdBy":"Vijaykumar",
"objectives":[
{
"objectiveId":"118",
"objectiveTitle":"Position level data (Stretch)"
},
{
"objectiveId":"261",
"objectiveTitle":"Configure for Internal users"
}
],
"answers":[
{
"questionId":"35",
"questionTitle":"Question 2"
},
{
"questionId":"36",
"questionTitle":"Question 2a"
}
]
}
]
}
А вот класс, который я создал для десериализации.
public class listOfSelfAssessments
{
public class selfAssessments
{
public List<assessments> assessments { get; set; }
}
public class assessments
{
public string deliveryTeamName { get; set; }
public string programIncrementId { get; set; }
public string programIncrementName { get; set; }
public string sprintId { get; set; }
public string sprintName { get; set; }
public string created { get; set; }
public string createdBy { get; set; }
public List<objectives> objectives { get; set; }
public List<answers> answers { get; set; }
}
public class objectives
{
public string objectiveId { get; set; }
public string objectiveTitle { get; set; }
}
public class answers
{
public string questionId { get; set; }
public string questionTitle { get; set; }
}
}
Все работает нормально до десериализации
response.EnsureSuccessStatusCode();
string responseBody = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
var format = "dd/MM/yyyy"; // your datetime format
var dateTimeConverter = new IsoDateTimeConverter { DateTimeFormat = format };
listOfSelfAssessments.selfAssessments results = new listOfSelfAssessments.selfAssessments();
results = JsonConvert.DeserializeObject<listOfSelfAssessments.selfAssessments>(responseBody);
Но проблема возникает здесь, когда моя итоговая таблица, в которую я хочу записать эти данные, выглядит так
team_name Type pi_id pi_name sprint_id Sprint_Name Type_Id Title
-----------------------------------------------------------------------------------------
Reporting Team Objective 125 1 558 1 118 Position Level Data
Reporting Team Objective 125 1 558 1 261 Configure for internal users
Reporting Team Question 125 1 558 1 35 Question 2
Reporting Team Question 125 1 558 1 36 Question 2a
--------------------------------------------------------------------------------------------------
Вот класс модели таблиц
public partial class BmtSelfassessmentResponse
{
public string Type { get; set; }
public int QuestionId { get; set; }
public string Team { get; set; }
public string Pi { get; set; }
public string Sprint { get; set; }
public DateTime? Created { get; set; }
public string CreatedBy { get; set; }
public string TypeId { get; set; }
public string Title { get; set; }
}
Я понятия не имею, как создать профиль автоматического отображения для этого json и класса модели таблицы
Пожалуйста, поделитесь идеей. Или полагаться на автомат в этой такой сложной иерархии-не очень хороший способ?
Комментарии:
1. Автомат можно было согнуть, чтобы выровнять данные, хотя он и не был предназначен для этого. Но, возможно, лучше сделать это вручную, с небольшой помощью LINQ.
2. Опубликуйте также класс модели таблицы
3. @Dialecticus Было бы здорово, если бы вы поделились некоторыми подсказками о том, как справиться с этим с помощью linq или любых функций со стрелками
4. @AkshayGaonkar Обновил вопрос
5. Попробуйте поискать в гугле «автоматический переход от одного ко многим».
Ответ №1:
Большое спасибо @Dialecticus за способ linq, с помощью которого я смог реализовать его без особых усилий. Просто опубликуйте это для кого-то, кто получил аналогичное требование
var objectives = (from a in results.assessments
from o in a.objectives
select new BmtSelfassessmentResponse { Art = a.agileReleaseTrainName, Team = a.deliveryTeamName, Active = true, ResponseV = (int.TryParse(o.completePercentage, out int p) ? (Convert.ToDecimal(o.completePercentage) / 100) : null), Type = "Objective" });
var answers = (from a in results.assessments
from q in a.answers
select new BmtSelfassessmentResponse { Art = a.agileReleaseTrainName, Team = a.deliveryTeamName, Active = true, ResponseT = q.answer,Type="Question" });
List<BmtSelfassessmentResponse> SA = objectives.Concat(answers).ToList<BmtSelfassessmentResponse>();