网络核心Web API JSON序列化-需要以$开头的字段

eri*_*007 7 c# asp.net-core json-serialization

我正在使用Net Core Web API,需要返回属性名称为“ $ skip”的有效负载。我尝试使用DataAnnotations:

public class ApiResponseMessage
{
    [Display(Name ="$skip", ShortName = "$skip")]
    public int Skip { get; set; }
    [Display(Name = "$top", ShortName = "$top")]
    public int Top { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在我的控制器中,我只是使用

return Json(payload)
Run Code Online (Sandbox Code Playgroud)

但是,我的响应有效负载如下所示:

"ResponseMsg": {
    "Skip": 0,
    "Top": 3
}
Run Code Online (Sandbox Code Playgroud)

我需要它是:

"ResponseMsg": {
    "$skip": 0,
    "$top": 3
}
Run Code Online (Sandbox Code Playgroud)

解决此问题的最佳选择是什么?我需要编写自己的ContractResolver或Converter吗?

Jho*_*uff 7

从.net core 3.0开始,该框架现在使用System.Text.Json。您可以使用以下命令装饰类中的json属性

[JsonPropertyName("htmlid")]
public string HtmlId { get; set; }
Run Code Online (Sandbox Code Playgroud)

请参阅System.Text.Json


小智 6

ASP.NET Core已经使用JSON.NET作为其基本JavaScriptSerializer。

这是依赖性。

Microsoft.AspNetCore.Mvc-> Microsoft.AspNetCore.Formatter.Json-> Microsoft.AspNetCore.JsonPatch-> Newtonsoft.Json

像这样装饰对象的示例将达到目标

[JsonObject]
public class ApiResponseMessage
{
    [JsonProperty("$skip")]
    public int Skip { get; set; }
    [JsonProperty("$top")]
    public int Top { get; set; }

    ....
}
Run Code Online (Sandbox Code Playgroud)


Ily*_*kov 3

使用JsonPropertyattribute 设置自定义属性名称:

[JsonProperty(PropertyName = "$skip")]
public int Skip { get; set; }
Run Code Online (Sandbox Code Playgroud)

输出:

{ "$skip": 1 }
Run Code Online (Sandbox Code Playgroud)

详细信息:使用 Json.net 序列化时如何更改属性名称?