【问题标题】:Fresh ASP.NET Core API returns empty JSON objectsFresh ASP.NET Core API 返回空 JSON 对象
【发布时间】:2017-06-01 23:05:25
【问题描述】:

我制作了一个 .NET Core Web API 项目来测试它。

我的问题是,当我请求位于“/api/cars/123”的端点时,API 返回一个空的 JSON 对象。无论我放入什么样的对象都会发生这种情况,除非它是任何原始数据类型或其数组。响应总是:

{}

应用程序的配置是完全默认的,在全新的 Visual Studio 2017 安装中。

我有以下课程:

Car.cs

namespace Ex6.Entities
{
    public class Car
    {
        private int Id { get; set; }
        private string Make { get; set; }
        private string Model { get; set; }

        public Car(int Id, string Make, string Model)
        {
            this.Id = Id;
            this.Make = Make;
            this.Model = Model;
        }
    }
}

CarsController.cs:

using Microsoft.AspNetCore.Mvc;
using Ex6.Entities;

namespace Ex6.Controllers
{
    [Route("api/[controller]")]
    public class CarsController : Controller
    {

        [HttpGet("{id}")]
        public JsonResult GetCar(int id)
        {
            return Json(new Car(1, "Toyota", "Aygo" ));
        }

    }
}

我错过了什么吗?

【问题讨论】:

  • 是的,再次更新问题。不过没关系:S
  • 是的,如果我在返回之前尝试将 Car 对象映射到变量,我可以在调试器中看到它的构造正确。 :)
  • 现在添加自动生成的文件
  • 我通过 API 访问它,例如通过向“/api/cars/123”发送 GET 请求。
  • 我需要一个 JSON 序列化器,还是 ASP.NET 核心会自动处理它?

标签: c# asp.net


【解决方案1】:

为了让 JsonSerializer 能够查看和序列化您的属性,它们必须是公开的:

public int Id { get; private set; } //the setters can be private
public string Make { get; set; }
public string Model { get; set; }

【讨论】:

  • 我在将旧版 WCF 转换为 WebAPI 时遇到了同样的问题。但是,我遇到的问题是一个包含所有字段但没有属性的结果类。我为所有字段添加了一个 getter 和 setter,以将它们转换为自动属性,一切正常。
  • 在文档中找不到这个。希望更容易找到这个答案...
  • 可以配置 JsonSerializer 来报告这类问题吗?
【解决方案2】:

通过添加配置试试这个

services.AddControllersWithViews().AddNewtonsoftJson();

....AddNewtonsoftJson() 这应该可以解决问题。

【讨论】:

    【解决方案3】:

    尝试像这样定义你的实体:

    namespace Ex6.Entities
    {
        public class Car
        {
            public int Id { get; set; }
            public string Make { get; set; }
            public string Model { get; set; }
    
            public Car(int _Id, string _Make, string _Model)
            {
                Id = _Id;
                Make = _Make;
                Model = _Model;
            }
        }
    }
    

    【讨论】:

    • 如何回答一个 3 年前的评论,该评论已经有一个公认的答案,减去 ctor 后几乎相同?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2017-11-13
    相关资源
    最近更新 更多