【问题标题】:Odata Asp.NET WebApi return json property in entity/DTOOdata Asp.NET WebApi 在实体/DTO 中返回 json 属性
【发布时间】:2016-02-12 15:09:46
【问题描述】:

我的实体QueryFilter 有一个属性,其中包含序列化的 json。 在QueryFilterDetailDTOController 中,我想反序列化 JSON,用一些数据丰富它,并返回带有新 JSON 数据的 DTO。

我希望能够直接使用丰富的 JSON 对象作为 javascript 中返回对象的属性(而不是字符串)。我怎样才能做到这一点?

我尝试将表达式的类型设置为JObject,但它的模型构建器抛出异常(因为递归类型)。这是正确的方法,还是有更好的方法?

DTO

public class QueryFilterDetailDTO
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Context { get; set; }
    public JObject Expression { get; set; }

    public QueryFilterDetailDTO(QueryFilter queryFilter)
    {
        ID = queryFilter.ID;
        Name = queryFilter.Name;
        Description = queryFilter.Description;
        Context = queryFilter.Context;
    }
}

控制器

public class QueryFilterDetailDTOController : ODataController
{
    private readonly IQueryFilterService _service;

    public QueryFilterDetailDTOController(IQueryFilterService service)
    {
        _service = service;
    }

    [HttpGet]
    [EnableQuery(MaxNodeCount = 1000)]
    public HttpResponseMessage Get([FromODataUri] int key)
    {
        var queryFilter = _service.Find(key);

        var dto = new QueryFilterDetailDTO(queryFilter);
        dto.Expression = JObject.Parse(queryFilter.SerializedFilter);
        dto.Expression["Test"] = 1;

        return Request.CreateResponse(HttpStatusCode.OK, dto);    
    }
}

创建模型

private static IEdmModel GetModel()
{
    ODataModelBuilder builder = new ODataConventionModelBuilder();
    builder.EntitySet<QueryFilterDetailDTO>("QueryFilterDetailDTO").EntityType.HasKey(dto => dto.ID);
    builder.GetEdmModel();
}

【问题讨论】:

    标签: c# json serialization asp.net-web-api odata


    【解决方案1】:

    您应该能够为此目的使用JsonExtensionData:

    public class QueryFilterDetailDTO
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public string Context { get; set; }
    
        [JsonExtensionData]
        public Dictionary<string, object> Expression { get; set; }
    }
    

    扩展数据包含无法映射到 c# 属性的任何 JSON 属性的键和值。

    更多详情请见here和here。

    【讨论】:

      猜你喜欢
      • 2013-12-17
      • 2013-06-02
      • 1970-01-01
      • 2013-03-27
      • 2018-12-28
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      相关资源
      最近更新 更多