【发布时间】: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