自动映射器。从 json 映射 属性
Automaper. Map property from json
我有一个响应模型。在模型中,我需要从 JSON 文件加载查询。例如,我从常量加载 json 数据。在实体(Problem
)中不需要属性Queries
,所以不存在
这是型号:
public class ProblemModel
{
public int Id { get; set; }
public bool IsResolved { get; set; }
public ICollection<QueryModel> Queries{ get; set; }
public int State {get; set; }
}
这是QueryModel
:
public class QueryModel
{
public string Query { get; set; }
public QueryModel[] Accept { get; set; }
public QueryModel[] No { get; set; }
}
这是 Automapper 配置文件
public class ProblemMappingProfile : Profile
{
public ProblemMappingProfile()
{
const string jsonData = @"[
{
'Query': 'Query1',
'Accept': [
{
'Query': 'Query1_1',
'Accept': [
{ }
],
'Reject': [
{ }
]
}
],
'Reject': [
{
'Query': 'Query1_2',
'Accept': [
{ }
],
'Reject': [
{ }
]
}
]
}
]";
QueryModel[] json = JsonSerializer.Deserialize<QueryModel[]>(jsonData.Replace('\'', '\"'));
CreateMap<Problem, ProblemModel>()
.ForMember(d => d.Queries, o => o.MapFrom(s => json))
.ReverseMap()
}
}
每次 ProblemModel
映射时我都需要加载查询。例如:
return _mapper.Map<ProblemModel>(await _context.Problems.Where(x => x.Id == id).FirstOrDefaultAsync());
或
return _mapper.Map<ProblemModel>(await _context.Problems.Where(x => x.state == 2).ToListAsync());
我试图在自动映射器配置文件中映射 Queries
,但这是错误的。因为配置文件构造函数只工作一次。构建自动映射配置文件后出现错误
An unhandled exception has occurred while executing the request.
System.ArgumentException: Field 'SimplyQuery.Services.Models.ProblemMappingProfile+<>c__DisplayClass0_0.json' is not defined for type 'SimplyQuery.Data.Entities.Problem'
所以我看不懂:
我需要在哪里映射 json 数据以将其动态包含到结果模型中?我该怎么做?
为什么我在构造函数中出错? JSON 数据反序列化很好,所以数组必须分配给另一个数组,不是吗?
抱歉,如果我的 post 理解不清楚。我已经解决了我的问题。我更改了我的自动映射器配置文件:
public class ProblemMappingProfile : Profile
{
private string jsonData = @"[
{
'Query': 'Query1',
'Accept': [
{
'Query': 'Query1_1',
'Accept': [
{ }
],
'Reject': [
{ }
]
}
],
'Reject': [
{
'Query': 'Query1_2',
'Accept': [
{ }
],
'Reject': [
{ }
]
}
]
}
]";
private QueryModel[] queries;
public ProblemMappingProfile()
{
CreateMap<Problem, ProblemModel>()
.BeforeMap((src, dest) => GetQuestions(@"Models\LandParcelModels\StateLandCadQuestions.json"))
.ForMember(d => d.Queries, o => o.MapFrom(s => queries.ToList()))
.ReverseMap()
}
private void GetQuestions(string questionsFilePath)
{
// here will be loading data into jsonData from file
queries = JsonSerializer.Deserialize<QueryModel[]>(jsonData.Replace('\'', '\"'));
}
}
我有一个响应模型。在模型中,我需要从 JSON 文件加载查询。例如,我从常量加载 json 数据。在实体(Problem
)中不需要属性Queries
,所以不存在
这是型号:
public class ProblemModel
{
public int Id { get; set; }
public bool IsResolved { get; set; }
public ICollection<QueryModel> Queries{ get; set; }
public int State {get; set; }
}
这是QueryModel
:
public class QueryModel
{
public string Query { get; set; }
public QueryModel[] Accept { get; set; }
public QueryModel[] No { get; set; }
}
这是 Automapper 配置文件
public class ProblemMappingProfile : Profile
{
public ProblemMappingProfile()
{
const string jsonData = @"[
{
'Query': 'Query1',
'Accept': [
{
'Query': 'Query1_1',
'Accept': [
{ }
],
'Reject': [
{ }
]
}
],
'Reject': [
{
'Query': 'Query1_2',
'Accept': [
{ }
],
'Reject': [
{ }
]
}
]
}
]";
QueryModel[] json = JsonSerializer.Deserialize<QueryModel[]>(jsonData.Replace('\'', '\"'));
CreateMap<Problem, ProblemModel>()
.ForMember(d => d.Queries, o => o.MapFrom(s => json))
.ReverseMap()
}
}
每次 ProblemModel
映射时我都需要加载查询。例如:
return _mapper.Map<ProblemModel>(await _context.Problems.Where(x => x.Id == id).FirstOrDefaultAsync());
或
return _mapper.Map<ProblemModel>(await _context.Problems.Where(x => x.state == 2).ToListAsync());
我试图在自动映射器配置文件中映射 Queries
,但这是错误的。因为配置文件构造函数只工作一次。构建自动映射配置文件后出现错误
An unhandled exception has occurred while executing the request.
System.ArgumentException: Field 'SimplyQuery.Services.Models.ProblemMappingProfile+<>c__DisplayClass0_0.json' is not defined for type 'SimplyQuery.Data.Entities.Problem'
所以我看不懂:
我需要在哪里映射 json 数据以将其动态包含到结果模型中?我该怎么做?
为什么我在构造函数中出错? JSON 数据反序列化很好,所以数组必须分配给另一个数组,不是吗?
抱歉,如果我的 post 理解不清楚。我已经解决了我的问题。我更改了我的自动映射器配置文件:
public class ProblemMappingProfile : Profile
{
private string jsonData = @"[
{
'Query': 'Query1',
'Accept': [
{
'Query': 'Query1_1',
'Accept': [
{ }
],
'Reject': [
{ }
]
}
],
'Reject': [
{
'Query': 'Query1_2',
'Accept': [
{ }
],
'Reject': [
{ }
]
}
]
}
]";
private QueryModel[] queries;
public ProblemMappingProfile()
{
CreateMap<Problem, ProblemModel>()
.BeforeMap((src, dest) => GetQuestions(@"Models\LandParcelModels\StateLandCadQuestions.json"))
.ForMember(d => d.Queries, o => o.MapFrom(s => queries.ToList()))
.ReverseMap()
}
private void GetQuestions(string questionsFilePath)
{
// here will be loading data into jsonData from file
queries = JsonSerializer.Deserialize<QueryModel[]>(jsonData.Replace('\'', '\"'));
}
}