【问题标题】:Newtonsoft.Json.ReferenceLoopHandling.Ignore deserialization format .NET Core 3.1Newtonsoft.Json.ReferenceLoopHandling.Ignore 反序列化格式.NET Core 3.1
【发布时间】:2021-03-15 15:14:53
【问题描述】:

我正在尝试使用 .NET Core 3.1 和 C# 编程语言制作一个 API,该语言通过 FireSharp Nu-Get 包利用 Google 的 Firebase 实时数据库。当我运行它时,我得到了这个异常:System.Text.Json.JsonException: A possible object cycle was detected which is not supported. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 32. 我读到here 我可以安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson 包并忽略引用循环处理,这工作正常。但是数据格式看起来不可读,很难反序列化,而且太长了:

{
"stateMachine": {
    "<>1__state": 0,
    "<>t__builder": {},
    "bpjs": "12345678",
    "reservationTime": "24-11-2020",
    "<>4__this": {}
},
"context": {},
"moveNextAction": {
    "method": {
        "name": "MoveNext",
        "declaringType": ...
...
((lots of irrelevant things))
...

    }
},
"result": {
    "queueNumber": "1",
    "bpjs": "12345678",
    "name": "Addi",
    "poli": "Umum",
    "reservationTime": "24-11-2020",
    "status": "Queueing"
},
"id": 2,
"exception": null,
"status": 5,
"isCanceled": false,
"isCompleted": true,
"isCompletedSuccessfully": true,
"creationOptions": 0,
"asyncState": null,
"isFaulted": false}

在此之前,我已经尝试按照this video 的DTO 教程做一些映射而不直接使用我的数据模型,但它很可能没有工作,因为我不使用SQL 数据库。

现在我正在尝试在 Flutter 应用上使用这个 API。无论如何,我是否可以对我的 API 代码(不涉及将数据库完全更改为 SQL 的任何内容)进行一些小的更改以重新格式化我的响应?或者也许只是部分反序列化我的响应的方法,因为我只需要“结果”部分而不需要其他任何东西?

编辑:

这是我获取数据的主要代码:

        public async Task<QueueData> GetQueueData(string bpjs, string reservationTime)
    {
        //set up connection
        IFirebaseConfig config = new FirebaseConfig
        {
            AuthSecret = myAuthSecret,
            BasePath = myBasePath
        };

        IFirebaseClient client = new FireSharp.FirebaseClient(config);

        //checkqueuenumber
        string queueCounter = await QueueDbConnection.CheckQueueNumber(reservationTime, client);

        //getresult
        QueueData result = await QueueDbConnection.GetResult(bpjs, reservationTime, queueCounter, client);
        return result;
    }

这是我调用上述函数的控制器:

        [HttpGet("{bpjs}/{reservationTime}")]
    public ActionResult<QueueData> GetQueueData(string bpjs, string reservationTime)
    {
        var queueData = _repository.GetQueueData(bpjs, reservationTime);
        return Ok(queueData);
    }

这是我的 QueueData 模型,这是我试图作为响应返回的类型:

    public class QueueData
{
    [Required]
    public string QueueNumber { get; set; }
    [Required]
    public string BPJS { get; set; }
    [Required]
    public string Name { get; set; }
    [Required]
    public string Poli { get; set; }
    [Required]
    public string ReservationTime { get; set; }
    [Required]
    public string Status { get; set; }
}

这是另一个名为 control 的模型类,用于监控每天排队的人数:

    public class QueueCounter
{
    [Required]
    public string q { get; set; }
}

【问题讨论】:

  • 这不是ReferenceLoopHandling.Ignore 格式。 ReferenceLoopHandling.Ignore 所做的只是忽略循环引用并且不序列化。你能分享一个minimal reproducible example吗?
  • @dbc 谢谢,我刚才加了。 CheckQueueNumber 和 GetResult 方法中有一些迭代,但我已经在另一个程序中使用它们并且它们工作得很好。不过,如果有帮助,我很乐意提供代码。
  • 请不要在您的问题标题中加上“已解决”。接受答案(正如您在此处所做的那样)是将问题标记为已解决的机制。

标签: c# json json.net asp.net-core-webapi asp.net-core-3.1


【解决方案1】:

所以,我解决了这个问题。我回到here,显然有人说我首先遇到的错误是因为并非所有异步函数都已被等待或正确处理。所以我再次检查了我的代码,最后在我的控制器中发现了问题。在我使控制器异步然后将返回类型更改为 Task 后,一切都很好!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 2020-03-13
    相关资源
    最近更新 更多