You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8中如何返回JSON?控制器返回JSON遇错误求助

解决Json序列化循环引用问题

问题根源

你的Product和Category实体存在双向关联(Product包含Category导航属性,Category大概率包含ICollection<Product>类型的导航属性),直接返回objProductList时,Json序列化器会尝试递归序列化这种双向引用,最终触发循环引用错误。

可行解决方案

方案1:用匿名类筛选返回字段

只序列化业务需要的字段,避免触发循环引用:

[HttpGet]
public IActionResult GetAllProduct()
{
    List<Product> objProductList = _unitOfWork.ProductRepository
                                              .GetAll(includeProperties: "Category")
                                              .ToList();

    var result = objProductList.Select(p => new {
        p.Id,
        p.Title,
        p.Price,
        p.Description,
        // 只取Category的必要字段,不要直接引用整个Category对象
        CategoryName = p.Category.Name
    });

    return Json(result);
}

方案2:全局配置Json序列化器忽略循环引用

在Program.cs中添加全局配置,让序列化器自动跳过循环引用:

builder.Services.AddControllersWithViews()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
    });

配置完成后,你可以直接返回objProductList,序列化器会自动处理循环引用问题。

方案3:使用DTO(数据传输对象)

定义专门的ProductDto类,剥离实体的关联属性,只保留需要返回的字段:

// 定义DTO类
public class ProductDto
{
    public int Id { get; set; }
    public string Title { get; set; }
    public decimal Price { get; set; }
    public string Description { get; set; }
    public string CategoryName { get; set; }
    // 按需添加其他业务需要的字段
}

// 在Controller中完成实体到DTO的转换
[HttpGet]
public IActionResult GetAllProduct()
{
    List<Product> objProductList = _unitOfWork.ProductRepository
                                              .GetAll(includeProperties: "Category")
                                              .ToList();

    var productDtos = objProductList.Select(p => new ProductDto
    {
        Id = p.Id,
        Title = p.Title,
        Price = p.Price,
        Description = p.Description,
        CategoryName = p.Category.Name
    }).ToList();

    return Json(productDtos);
}

选型建议

  • 优先选DTO或匿名类方案:既能彻底避免循环引用,还能减少不必要的数据传输,提升接口性能。
  • 全局配置方案适合快速调试,但可能隐藏一些意外的关联逻辑问题,生产环境建议谨慎使用。

内容的提问来源于stack exchange,提问作者Nguyen Tuan Anh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 12:44:54