部分 JSON 对象在 .net6/webAPI 中因 HttpClient/IActionResult 交换而丢失

Part of JSON object lost over HttpClient/IActionResult exchange in .net6/webAPI

我有一个 BlazorWASM 客户端请求我的 API 在 .Net5/6.

中使用 HttpClient 的响应

填充对象 'DataManifest' 然后通过 IActionResult 通过 OK() 方法提交:

   [HttpGet]
    [Route("/Data/GetManifest")]
    public async Task<IActionResult> GetManifest()
    {
        try
        {
            DataManifest manifest = new();
            manifest.LastJob = await _db.jobs.MaxAsync(x=>x.id);
            manifest.LastJobCost = await _db.jobcosts.MaxAsync(x => x.id);
            manifest.LastEvent = await _db.events.MaxAsync(x => x.task_id);
            manifest.LastPurchaseInvoice = await _db.purchaseinvoices.MaxAsync(x => x.id);
            manifest.LastTimeRecord = await _db.TimeRecords.MaxAsync(x => x.id);
  
            return Ok(new ApiResponse<DataManifest> { IsSuccess = true, Message = "", Value = manifest, msTiming = (int)watch.ElapsedMilliseconds });

在 VS 中检查对象显示它是完整的,包含数据,'manifest' 的属性设置正确。

但是查看 http 响应(状态:200)中包含的内容,Edge 中 DevTools 的值/'manifest' 对象为空(其他字段按预期填充):

{value: {}, message: "", isSuccess: true, msTiming: 17}

我还有其他运行良好的 HttpGet(确实是像 ApiResponse 这样的对象)。我不明白为什么我的 DataManifest 对象会导致问题!

--- 更多信息: ApiResponse 是:

 public class ApiResponse
{
    public string Message { get; set; } = default!;
    public bool IsSuccess { get; set; }
    public int msTiming { get; set; }

}

public class ApiResponse<T> : ApiResponse
{
    public T Value { get; set; } = default!;
}

清单:

 public class DataManifest
{
    public int lastJob;
    public int LastEvent;
    public int LastJobCost;
    public int LastPurchaseInvoice;
    public int LastTimeRecord;
}

你能检查一下 Value 字段定义中没有 JsonIgnore 属性吗?

通过评论解决了,这里的问题是 DataManifest 声明只有字段。

默认情况下,System.Text.Json 忽略字段。您可以通过选项或通过字段上的属性手动配置它以包含它们,但也可以将字段转换为属性以使其工作。

基本上,改变这个:

public class DataManifest
{
    public int lastJob;
    public int LastEvent;
    public int LastJobCost;
    public int LastPurchaseInvoice;
    public int LastTimeRecord;
}

对此:

public class DataManifest
{
    public int lastJob { get; set; }
    public int LastEvent { get; set; }
    public int LastJobCost { get; set; }
    public int LastPurchaseInvoice { get; set; }
    public int LastTimeRecord { get; set; }
}