我正在尝试使用带有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; }
}
这是另一个称为控制的模型类,用于监控每天排队的人数:
public class QueueCounter
{
[Required]
public string q { get; set; }
}
所以,我解决了这个问题。我回到这里,显然有人说我一开始遇到的错误是因为并不是所有的异步函数都得到了正确的等待或处理。所以我再次检查了我的代码,最终在我的控制器中发现了问题。在我使我的控制器异步之后,然后将返回类型更改为Task<ActionResult>,一切都很顺利!