首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Asp.Net CoreWebAPI2.2控制器没有返回完整的JSON

Asp.Net CoreWebAPI2.2控制器没有返回完整的JSON
EN

Stack Overflow用户
提问于 2019-02-11 15:00:18
回答 3查看 6.8K关注 0票数 8

我在我的Asp.Net CoreWebAPI2.2项目中有一个Web控制器。

Messageboard模型:

代码语言:javascript
复制
public class MessageBoard
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }

        public ICollection<Message> Messages { get; set; }
    }

Message模型:

代码语言:javascript
复制
public class Message
    {
        public long Id { get; set; }
        public string Text { get; set; }
        public string User { get; set; }
        public DateTime PostedDate { get; set; }

        public long MessageBoardId { get; set; }
        [ForeignKey("MessageBoardId")]
        public MessageBoard MessageBoard { get; set; }
    }

这是我的Web操作之一,简称为简洁:

代码语言:javascript
复制
[Route("api/[controller]")]
[ApiController]
public class MessageBoardsController : ControllerBase
{        
      // GET: api/MessageBoards
      [HttpGet]
      public async Task<ActionResult<IEnumerable<MessageBoard>>> GetMessageBoards()
      {
         return await _context.MessageBoards
            .Include(i => i.Messages)
            .ToListAsync();
      }
}

每当我向MessageBoards发出GET请求时,只返回一部分正确的JSON。下面是在邮递员上访问https://localhost:44384/api/MessageBoards/时返回的JSON:

[{"id":1,“名称”:“Test board 2",”description“:”用于测试的第二个留言板“,”messages“:[{id”:1,“text”:“Test my first message!","user":"Jesse","postedDate":"2019-01-01T00:00:00","messageBoardId":1

JSON被切断(因此它是一个丑陋的块,没有被邮递员美化),这大概是由于MessageBoard模型上的Message属性,因为它是第一个丢失的JSON项。

如何使操作正确返回MessageBoards和子消息的列表?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-11 15:08:09

我看到您在查询中使用Eager Loading。因此,在Startup类中添加以下配置,以忽略它在对象图中找到的周期,并正确地生成JSON响应。

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddMvc()
        .AddJsonOptions(
            options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
        );

    ...
}

有关更多详细信息:EF核中的相关数据及序列化

票数 16
EN

Stack Overflow用户

发布于 2020-01-17 16:35:55

在我的例子中,选择的答案也是正确的,我的JSON响应被JSON响应中的一个引用循环截断,而设置ReferenceLoopHandling.Ignore确实解决了我的问题。然而,在我看来,这并不是最好的解决方案,因为这维护了模型中的循环引用。更好的解决方案是在模型中使用JsonIgnore属性。

您的模型中的问题是:

代码语言:javascript
复制
public class MessageBoard
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }

        public ICollection<Message> Messages { get; set; }
    }

public class Message
    {
        public long Id { get; set; }
        public string Text { get; set; }
        public string User { get; set; }
        public DateTime PostedDate { get; set; }

        public long MessageBoardId { get; set; }
        [ForeignKey("MessageBoardId")]
        public MessageBoard MessageBoard { get; set; } //This is the cause of your circular referece!!!
    }  

如您所见,MessageBoard导航属性是截断此响应的地方。具体来说,它将导致json响应中的每个消息包含响应中每个消息条目的所有MessageBoard信息。Newtonsoft不喜欢这个。解决方案是简单地JsonIngore导致这个循环引用的导航属性。在您的代码中,这将是:

代码语言:javascript
复制
public class MessageBoard
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }

        public ICollection<Message> Messages { get; set; }
    }

public class Message
    {
        public long Id { get; set; }
        public string Text { get; set; }
        public string User { get; set; }
        public DateTime PostedDate { get; set; }

        public long MessageBoardId { get; set; }

        [JsonIgnore]
        [ForeignKey("MessageBoardId")]
        public MessageBoard MessageBoard { get; set; } //fixed!!!
    }  
票数 1
EN

Stack Overflow用户

发布于 2019-02-11 15:05:16

尝试创建并返回不具有循环信息的DTO或新结构/类(MessageBoard有具有MessageBoard等的消息,等等)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54633340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档