You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# Web API返回JSON无法正确解析为Booking实体对象

问题原因

你遇到的反序列化后字段全为默认值的问题,核心出在服务端接口的返回写法错误:
你的接口返回类型声明为JsonResult,但内部返回时调用了Ok(booking)、NotFound()方法——这两个方法本身就会生成标准的IActionResult类型结果,你再把这个结果传入JsonResult构造函数,相当于把整个IActionResult对象做了二次序列化。最终返回的JSON结构里,Value、StatusCode、Formatters这些都是IActionResult实例的属性,实际的Booking业务数据被嵌套在Value字段下,客户端直接把整个JSON反序列化为Booking类型时,找不到和Booking属性匹配的顶级字段,自然所有字段都是默认值。

修复方案

优先方案:修正服务端接口写法(推荐,符合Web API开发规范)

去掉多余的JsonResult包装,将接口返回类型改为IActionResult,直接返回框架内置的ActionResult即可,框架会自动完成JSON序列化配置:

[HttpGet]        
public async Task<IActionResult> Get(int id)
{
    Booking? booking = await _bookingRepository.FindByIdAsync(id);

    if (booking == null)
    {
        return NotFound();
    }
    return Ok(booking);
}

修改后接口返回的JSON会直接是Booking对象的结构,和你定义的实体类完全匹配:

{
  "Id": 5,
  "RoomNumber": 100,
  "ClientName": "Nelms, Anthony"
}

你原来写的客户端反序列化代码不需要做任何修改,就能正常拿到完整的Booking字段值。

临时兼容方案:调整客户端反序列化逻辑

如果暂时无法修改服务端代码,可以在客户端先匹配外层返回结构,再取出嵌套的业务数据:

  • 先定义一个泛型响应类匹配接口的外层结构,不需要的字段可以省略,JSON反序列化会自动忽略不存在的属性:
public class EnvelopedResponse<T>
{
    public T? Value { get; set; }
    public int StatusCode { get; set; }
}
  • 修改反序列化逻辑,先反序列化为外层包装类型,再取Value属性:
string msg = await response.Content.ReadAsStringAsync();
var wrappedResult = JsonConvert.DeserializeObject<EnvelopedResponse<Booking>>(msg);
Booking? booking = wrappedResult?.Value;

这种方案仅作为临时兼容使用,长期来看还是建议修复服务端的返回逻辑,避免多余的结构嵌套。


内容的提问来源于stack exchange,提问作者Andy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 08:45:32