如何在映射配置中为JSON的Base64内容字段添加类型与字符集?
问题:能否通过映射配置修改JSON响应体中content字段的格式?
我需要修改如下JSON响应体:
{ "id": "1581fbd2-c045-4162-9f4c-ddbca6a88d61", "content": "//content in base64", "title": "ProfileImage", "type": "image/jpeg", "created": "2023-08-03T18:55:46.736405+03:00" }
将其中的content字段修改为:
"content": "Data: image/jpeg; Charset: utf-8;//content in base64"
目前我已经在控制器中通过硬编码实现了需求,代码如下:
var result = await _mediaService.GetById(id); if (result == null) { return NotFound(); } string base64Data = Convert.ToBase64String(result.Content); string metaInfo = string.Format("Data: {0}; Charset: {1}", result.Type, Encoding.UTF8.WebName); string base64String = metaInfo + Convert.ToBase64String(result.Content); var mapResult = _mapper.Map<MediaModelResponse>(result); var response = new { mapResult.Id, Content = base64String, mapResult.Title, mapResult.Created }; return Ok(response);
这个方案可行,但我希望找到更优的实现方式,比如通过映射配置来完成,而不是在控制器里处理。我还尝试过在模型中新增ContentTest字段并直接赋值,但这不是理想方案。
解决方案:使用AutoMapper映射配置实现
完全可以通过映射配置实现,以AutoMapper为例,你可以创建自定义映射Profile,把content字段的格式转换逻辑集中在映射配置里,让控制器代码更简洁。
步骤1:创建映射Profile
public class MediaProfile : Profile { public MediaProfile() { CreateMap<Media, MediaModelResponse>() .ForMember(dest => dest.Content, opt => opt.MapFrom(src => $"Data: {src.Type}; Charset: {Encoding.UTF8.WebName};{Convert.ToBase64String(src.Content)}")); // 其余字段默认自动映射,无需额外配置 } }
步骤2:简化控制器代码
配置好映射后,控制器只需调用映射方法即可,无需手动拼接content内容:
var result = await _mediaService.GetById(id); if (result == null) { return NotFound(); } var response = _mapper.Map<MediaModelResponse>(result); return Ok(response);
方案优势
- 格式转换逻辑集中在Profile中,符合单一职责原则,后续修改规则只需调整这里
- 控制器代码仅处理请求响应流程,无需关注字段转换细节
- 复用性强,所有需要转换Media到MediaModelResponse的场景都会自动应用该格式规则
内容的提问来源于stack exchange,提问作者Winter Wind
相关产品推荐
相关产品推荐

