Dip*_*pak 1 c# serialization entity-framework-6
我有这样的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; }
}
Run Code Online (Sandbox Code Playgroud)
我希望当我使用任何 API 发送这个对象时,它应该像 DataMember 中提到的那样在 JSON 中给出属性名称,但它没有发生。对于 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);
}
}
Run Code Online (Sandbox Code Playgroud)
DataMemberAttribute被Json.NET忽略,DataContractJsonSerializer除非[DataContract]也应用于类型本身。从文档:
将 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; }
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是数据契约序列化选入,所以你现在也必须标记Id和Children使用[DataMember]。