我有Dto喜欢这个:
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中提到的那样,但它没有发生。对于ex.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);
}
}
答案 0 :(得分:4)
DataMemberAttribute
被Json.NET和DataContractJsonSerializer
忽略,除非[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,因此您现在还必须使用Id
标记Children
和[DataMember]
。
答案 1 :(得分:0)
请参阅.NET NewtonSoft JSON deserialize map to a different property name
[JsonProperty("new name")]
public string SomeColumn { get; set; }
但是,这会假设您使用Newtonsoft作为JSON序列化程序。如果您将其替换为另一个,则必须使用特定于该序列化程序的属性。