首页 > 解决方案 > 底层类未转换为 json

问题描述

问题:最初的命令返回 ExecutionResult,其中包含类型为 DomainOperationResult 的 Data 属性。

只有在一种情况下,我需要返回一些其他数据,这些数据定义为 CreateOrderCommandResult,它是 DomainOperationResult 的后代,它包含附加字段 - Url。

大摇大摆地调用命令,在调试器中,一切都很好,带有快速查看的可见 id 和 url。

Json(result);

它表明它正在返回 Id 和 Url 属性。

但在 swagger、curl、postman 等中,只返回 id,尝试了一切。没有响应的 URL。

控制器工作正常,没有中间件,可能会改变返回的响应。

控制器方法:

{
 public async Task<IActionResult> Create([FromBody] CreateOrderCommand command)
        {
            if (!ModelState.IsValid)
            {
                return await Task.FromResult(BadRequest(ModelState));
            }

            var result = await _commandExecutor.ExecuteAsync(command);

            if (result.Success)
            {
                return Json(result);
            }

            return Json(result);
        }
}

创建订单命令:

{
    public override async Task<CommandExecutionResult> ExecuteAsync()
        {
             // .....
             return await OkAsync(new CreateOrderCommandResult(orderId, payment.RedirectUrl));
        }
}

域操作结果:

{
    public class DomainOperationResult
    {
        public DomainOperationResult()
        {
        }

        public DomainOperationResult(long id)
        {
            Id = id;
        }

        public long Id { get; }
}

创建订单命令结果:

{
    public class CreateOrderCommandResult : DomainOperationResult
    {
        public CreateOrderCommandResult()
            : base() { }

        public CreateOrderCommandResult(long id, string url)
            : base(id)
        {
            Url = url;
        }

        public string Url { get; set; }
    }
}

执行结果:

public class ExecutionResult
    {
        public ExecutionResult()
        {
        }

        public DomainOperationResult Data { get; set; }

    }

返回响应:

{“成功”:真,“数据”:{“id”:0},“错误”:{“错误”:空}}

标签: c#asp.net-coreasp.net-core-mvc

解决方案


仍然不知道,为什么这不起作用。

经过一番挖掘,找到了解决方法。

Response.Headers.Add("Content-type", "application/json"); return Content(JsonConvert.SerializeObject(result, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }));

返回这样的内容可以正常工作 - 至少它会生成我需要的一切。


推荐阅读