从 web api 响应中删除 $id

Posted

技术标签:

【中文标题】从 web api 响应中删除 $id【英文标题】:Removing $id from web api response 【发布时间】:2021-02-09 12:54:12 【问题描述】:

我有一个 web api 5.0,它返回一个非常基本的对象的 dto。这里是课堂

[JsonObject(IsReference = false)] 
public class BillToReturnDto

    public string id  get; set;  
    public string organizationId  get; set;  


但是当我返回它的列表时,它会像这样返回

"$id": "1", “$值”:[ "$id": "2", "id": "rvKLS178QWyWJu0tgESTnA", "organizationId": "ujoF624LSVyyQFapjauyAw", , "$id": "2", "id": "xvWfrRQWyyG0tgEd53dW", "organizationId": "ujoF624LSVyyQFapjauyAw", ]

如何删除这些 ID?我试过 IsReference false 你可以看到无济于事

更新:

这是控制器方法:

    public async Task<ActionResult> Get()
    
        var userId = User.FindFirst("Id").Value;
        var accessToken = await _userService.GetAccessToken(Convert.ToInt32(userId));
        var bills = await _shoppingService.GetBills(accessToken);
        var billsToReturn = _mapper.Map<List<BillToReturnDto>>(bills.bills);
        return Ok(billsToReturn);
    

【问题讨论】:

请告诉我们返回结果的控制器 @IbraHimM.Nada 我已经在更新中做到了,谢谢 你使用 asp.neet 核心?或 mvc 以确保 我使用的是新的 5.0,它本质上是核心,但他们已经从名称中删除了核心 最新的是核心 3.X 【参考方案1】:

startup.cs 中的这一行可能会在我的情况下造成问题:

   services.AddControllers()
                .AddJsonOptions(options =>
                
                    options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;
                );

删除 .AddJsonOptions([....]) 看看它是否适合你。

【讨论】:

完美工作。谢谢。【参考方案2】:

首先,如果您使用的是 .NET Core 3.1 到 5.0(当前是最新版本),请安装以下 NuGet 包: https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.NewtonsoftJson/)

它公开了一个名为 ReferenceLoopHandling 的新属性,可用于删除 Web API .JSON 响应中的 $id 引用。

接下来,在您的 Startup 类中,将以下内容附加到 services.AddControllers() 行:

// add controllers and the newtonsoft option to not include a reference $id
services.AddControllers().AddNewtonsoftJson(options =>
   options.SerializerSettings.ReferenceLoopHandling = 
Newtonsoft.Json.ReferenceLoopHandling.Ignore);

...现在试试...

【讨论】:

【参考方案3】:

Program.cs (.NET 6) 或 Startup.cs (.NET 5) 中的更改:

services.AddControllers().AddJsonOptions(options =>
           
                options.JsonSerializerOptions.ReferenceHandler = 
                ReferenceHandler.Preserve;
            );

收件人:

services.AddControllers().AddJsonOptions(options =>
               
                    options.JsonSerializerOptions.ReferenceHandler = 
                    ReferenceHandler.IgnoreCycles;
                ); 

【讨论】:

以上是关于从 web api 响应中删除 $id的主要内容,如果未能解决你的问题,请参考以下文章

如何从 api 响应中删除不需要的字符

.NET Core:从 API JSON 响应中删除空字段

Laravel Eloquent API 资源:从响应(集合)中删除“数据”键

如何从 CURL 响应 PHP API 的 JSON 字符串中删除引号、不需要的数据

如何从 Laravel 8 中的自定义 Web 路由中删除“api/”前缀?

如何从特定单击的响应中删除数组中的索引