1

所以我已经从使用 Java 转向 C#,而人是 Spring boot 与 C# 不同。我正在尝试使用 mongodb 数据库将对象列表返回到 rest API。但结果并没有返回一个列表,而是一些包含我的列表的对象。

品牌类

[BsonIgnoreExtraElements]
public class Brand
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string _id { get; set; }
    public string name { get; set; }
}

控制器

[HttpGet("getAllBrands")]
public async Task<IActionResult> Get()
{
    var brands = await _brandRepository.getAllBrands();

    List<Brand> list = (List<Brand>) brands;

    return new JsonResult(list);
} 

品牌库

public async Task<IEnumerable<Brand>> getAllBrands()
{
    var brands = await _brands.Find(_ => true).ToListAsync();
    return brands;
}

我的期望

[
      {
        "_id": "60d235f60f8c98376ba5b67d",
        "name": "Some brand 1"
      },
      {
        "_id": "60d24d6b0f8c98376ba5b68c",
        "name": "Some brand 2"
      },
      {
        "$id": "6",
        "_id": "60d24e4b0f8c98376ba5b68d",
        "name": "Some brand 3"
      }
    ]

我实际上得到了什么

{
  "$id": "1",
  "$values": [
    {
      "$id": "2",
      "_id": "60d235f60f8c98376ba5b67d",
      "name": "Some brand 1"
    },
    {
      "$id": "4",
      "_id": "60d24d6b0f8c98376ba5b68c",
      "name": "Some brand 2"
    },
    {
      "$id": "6",
      "_id": "60d24e4b0f8c98376ba5b68d",
      "name": "Some brand 1"
    }
  ]
}

我如何只返回一个简单的对象列表作为我的结果而不是那个?谢谢

4

2 回答 2

5

当您的 JSON 序列化程序设置为保留引用时,您看到的 JSON 是预期的。有了这个,元数据成员($id, $ref, $values)被添加,以便可以在 JSON 中引用对象,而不是重复。

更具体地说(参见ReferenceHandler.Preserve):

对于可枚举类型,例如 List,JSON 数组必须按顺序嵌套在包含 $id 和 $values 元数据属性的 JSON 对象中

这可能是在您的应用启动时配置的,例如:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
        .AddJsonOptions(options => 
           options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve);
}

要获得预期的 JSON,您需要禁用此功能。您可以像以前一样在应用程序启动中执行此操作:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
        .AddJsonOptions(options => 
           options.JsonSerializerOptions.ReferenceHandler = null);
}

或仅针对该特定端点:

[HttpGet("getAllBrands")]
public async Task<IActionResult> Get()
{
    var brands = await _brandRepository.getAllBrands();

    List<Brand> list = (List<Brand>) brands;

    return new JsonResult(list, new JsonSerializerOptions
    {
        ReferenceHandler = null,
        WriteIndented = true
    });
}
于 2021-07-18T15:51:08.600 回答
0

在您的控制器中尝试这段代码

public async Task<ActionResult<Brand>> Get()
{
    var brands = await _brandRepository.getAllBrands();

    List<Brand> list = (List<Brand>) brands;

    return Ok(list);
} 

如果Ok()有错误,请确保您Controller的继承自BaseController

于 2021-07-18T15:25:41.663 回答