【问题标题】:DataMember Name property not working in entity frameworkDataMember Name 属性在实体框架中不起作用
【发布时间】:2017-03-20 03:15:17
【问题描述】:

我必须像这样:

public class OptimizationNodeDto : IModelWithId
    {        
        public int Id { get; set; }

        [DataMember(Name = "parentId")]
        public int? ParentOptimizationNodeId { get; set; }

        [DataMember(Name = "name")]
        public string Text { get; set; }

        [DataMember(Name = "opened")]
        public bool IsOpened { get; set; }

        [DataMember(Name = "selected")]
        public SelectedStates SelectedState { get; set; }

        public List<OptimizationNodeDto> Children { get; set; }
    }

我希望当我使用任何 API 发送此对象时,它应该在 JSON 中提供属性名称,就像 DataMember 中提到的那样,但它没有发生。例如,ParentOptimizationNodeId 应该是 JSON 结果中的 parentId。 我在这里发送 Dto:

 [Route("{roleId}/Optimizations")]
        [HttpPost]
        public IHttpActionResult GetOptimizationList([FromUri]int roleId, [FromBody] FilterDto filter)
        {
            try
            {
                var groupManBo = _serviceLocator.Resolve<IRoleManagerBo>();
                return Ok(groupManBo.GetOptimization(roleId, this.ViewboxUser, filter));
            }
            catch (Exception ex)
            {
                return this.HandleError(ex);
            }
        }

【问题讨论】:

  • 你使用的是什么 Json 序列化器?
  • 我是 Json 序列化程序的新手。请您建议执行此操作的步骤。
  • 嗯嗯,你发送这个 DTO 的代码在哪里?
  • 我更新了我的问题。
  • 好吧,我认为 [DataMember] 不是重命名 JSON 键的正确属性,我认为 [JsonProperty(PropertyName="")] 是您想要的。

标签: c# serialization entity-framework-6


【解决方案1】:

DataMemberAttributeJson.NETDataContractJsonSerializer 忽略,除非[DataContract] 也应用于类型本身。来自docs

应用 DataMemberAttribute 属性结合 DataContractAttribute 来识别属于数据协定一部分的类型的成员。

因此您的 DTO 必须如下所示:

[DataContract]
public class OptimizationNodeDto : IModelWithId
{
    [DataMember]
    public int Id { get; set; }

    [DataMember(Name = "parentId")]
    public int? ParentOptimizationNodeId { get; set; }

    [DataMember(Name = "name")]
    public string Text { get; set; }

    [DataMember(Name = "opened")]
    public bool IsOpened { get; set; }

    [DataMember(Name = "selected")]
    public SelectedStates SelectedState { get; set; }

    [DataMember]
    public List<OptimizationNodeDto> Children { get; set; }
}

请注意,数据合约序列化为opt-in,因此您现在还必须将IdChildren 标记为[DataMember]

【讨论】:

    【解决方案2】:

    .NET NewtonSoft JSON deserialize map to a different property name

    [JsonProperty("new name")]
    public string SomeColumn { get; set; }
    

    但是,这假设您使用 Newtonsoft 作为 JSON 序列化程序。如果您将其替换为不同的,则必须使用特定于该序列化程序的属性。

    【讨论】:

      猜你喜欢
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多