首页 > 解决方案 > Newtonsoft.Json.ReferenceLoopHandling.Ignore 反序列化格式.NET Core 3.1

问题描述

我正在尝试使用带有 C# 编程语言的 .NET Core 3.1 创建一个 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.读到我可以安装 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}

在此之前,我已经尝试按照此视频的 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; }
}

标签: c#jsonjson.netasp.net-core-webapiasp.net-core-3.1

解决方案


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


推荐阅读