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

ASP.NET Core GET接口返回JSON如何去掉外层大括号包裹?

解决方案

你当前返回的外层{}是RequestInformation包装类序列化后的结果,只需要调整返回逻辑,直接返回内层的requestInfo集合即可实现需求,嵌套的claiminfo列表不受任何影响,也不需要使用SingleOrDefault这类方法。

方案:调整返回结构(最稳定高效)

1. 仅修改控制器代码(无需改动业务逻辑)

你不需要修改业务层的代码,只需要在控制器返回时,取出RequestInformation对象里的requestInfo属性返回即可:

[HttpGet]
public async Task<IActionResult> getRequestInfo([FromQuery] RequestInfo model)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    try
    {
        var resultWrapper = await _request.getRequestInfo(model);
        // 直接返回内层数组,序列化后最外层为[],无多余{}包装
        return Ok(resultWrapper.requestInfo);
    }
    catch (Exception ex)
    {
        return BadRequest(ex.Message);
    }
}

修改后返回的JSON结构如下,完全符合你的要求:

[
    {
        "requestId": 118170,
        "firstRead": "1905-06-24T00:00:00",
        "requestAnswerSent": "2021-09-09T00:00:00",
        "currentMilage": "13131",
        "damageOccured": "1753-01-01T00:00:00",
        "milageDamageOccured": 0,
        "latestService": "1753-01-01T00:00:00",
        "latestServiceKm": 0,
        "contractID": 00000,
        "requestRecieved": "2021-10-08T16:18:58.237",
        "requestStatus": "NEW_REQUEST",
        "claiminfo": [
            {
                "claimId": 387498,
                "name": "Claim",
                "answerSent": "2021-09-09T00:00:00"
            },
            {
                "claimId": 387499,
                "name": "Rent Replacement Car",
                "answerSent": "2021-09-09T00:00:00"
            },
            {
                "claimId": 387500,
                "name": "Other Work",
                "answerSent": "2021-09-09T00:00:00"
            }
        ]
    }
]

2. 可选:精简业务层代码

如果不需要保留RequestInformation包装类,可以直接修改业务方法的返回值,去掉多余的包装逻辑:

// 修改返回值类型为IEnumerable<RequestInfo>
public async Task<IEnumerable<RequestInfo>> getRequestInfo(RequestInfo model)
{
    var parameters = new DynamicParameters();
    parameters.Add("@requestId", model.requestId);
    var getAllRequest = await _sqlconnection.QueryAsync<RequestInfo>(@"SELECT TOP 1
    Request.ID as requestId, 
    FirstRead as firstRead,
    CurrentKilometerreading as currentMilage, 
    DamageDate as damageOccured, DamageKilometerreading as milageDamageOccured,
    LatestServiceDate as latestService, LatestServiceKilometer as latestServiceKm,
    ClaimHandlingStatus.Name as requestStatus, Request.CreatedDate as requestRecieved, 
    Contract.ID as contractID
    FROM Request 
    INNER JOIN RequestCrossClaim ON Request.ID = RequestCrossClaim.RequestID
    INNER JOIN Claim ON RequestCrossClaim.ClamID = Claim.ID
    INNER JOIN Contract ON Request.ContractID = Contract.ID
    INNER JOIN ClaimHandlingStatus ON Request.ClaimHandlingStatusID = 
    ClaimHandlingStatus.ID
    WHERE Request.ID = @requestId", parameters);


    var getClaimsForRequet = await _sqlconnection.QueryAsync<ClaimInfo>(@"
    SELECT RequestType.Name, AnswerSent, Claim.ID as claimId
    FROM Request
    INNER JOIN RequestCrossClaim ON Request.ID = RequestCrossClaim.RequestID
    INNER JOIN Claim ON RequestCrossClaim.ClamID = Claim.ID
    INNER JOIN RequestType ON RequestTypeID = RequestType.ID
    WHERE Request.ID = @requestId", parameters);

    foreach (var r in getAllRequest)
    {
        r.claiminfo = getClaimsForRequet.OrderBy(s => s.claimId);
    }
    // 直接返回请求集合,不需要外层包装
    return getAllRequest;
}

修改后控制器可以直接返回业务方法的结果:

var list = await _request.getRequestInfo(model);
return Ok(list);

注意

不建议使用序列化后裁剪字符串的方式实现需求,这种方法遇到JSON内容包含转义字符、特殊符号时极易出错,上述结构调整的方案是最符合.NET序列化规范、稳定性最高的实现方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:36:03