返回属性名称首字母小写的 json

Posted

技术标签:

【中文标题】返回属性名称首字母小写的 json【英文标题】:Return json with lower case first letter of property names 【发布时间】:2016-08-21 09:44:15 【问题描述】:

我有登录模型:

public class LoginModel : IData

    public string Email  get; set; 
    public string Password  get; set; 

我有 Web api 方法

public IHttpActionResult Login([FromBody] LoginModel model)

    return this.Ok(model);

返回 200 和正文:


    Email: "dfdf",
    Password: "dsfsdf"

但我想在属性中使用较低的首字母,例如


    email: "dfdf",
    password: "dsfsdf"

我有 Json 合同解析器来纠正

public class FirstLowerContractResolver : DefaultContractResolver

    protected override string ResolvePropertyName(string propertyName)
    
        if (string.IsNullOrWhiteSpace(propertyName))
            return string.Empty;

        return $"char.ToLower(propertyName[0])propertyName.Substring(1)";
    

我该如何应用这个?

【问题讨论】:

这行得通吗? tostring.it/2012/07/18/customize-json-result-in-web-api 【参考方案1】:

如果您使用的是 Newtonsoft.Json,您可以将 JsonProperties 添加到您的视图模型中:

public class LoginModel : IData

     [JsonProperty(PropertyName = "email")]
     public string Email get;set;

     [JsonProperty(PropertyName = "password")]
     public string Password get;set;

【讨论】:

【参考方案2】:

要强制从 api 返回的所有 json 数据为驼峰式,使用 Newtonsoft Json 和默认的驼峰式合约解析器会更容易。

创建一个像这样的类:

using Newtonsoft.Json.Serialization;

internal class JsonContentNegotiator : IContentNegotiator

    private readonly JsonMediaTypeFormatter _jsonFormatter;

    public JsonContentNegotiator(JsonMediaTypeFormatter formatter)
    
        _jsonFormatter = formatter;          
        _jsonFormatter.SerializerSettings.ContractResolver =
            new CamelCasePropertyNamesContractResolver();
    

    public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
    
        return new ContentNegotiationResult(_jsonFormatter, new MediaTypeHeaderValue("application/json"));
    

并在 api 配置期间(在启动时)进行设置:

var jsonFormatter = new JsonMediaTypeFormatter();
httpConfiguration.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));

【讨论】:

即使在 WebAPI 项目中使用实体框架也能很好地工作。只需将此处提供的启动代码放在WebApiConfig 类中(将httpConfiguration 替换为config)。 只有一个问题,所有 json 字段,以及与视图模型无关的字段,都将小写。另一个问题是它不适用于嵌套属性/对象,即:myTopKey.MySubKey --should be---> myTopKey.mySubKey【参考方案3】:

你可以在web API的配置或者启动文件中添加以下两条语句

使用 Newtonsoft.Json;
使用 Newtonsoft.Json.Serialization;

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented;

但是非常重要要使用return Ok()方法而不是return Json() 否则;这不起作用。

如果你必须使用 Json 方法(并且别无选择) 然后看到这个答案https://***.com/a/28960505/4390133

【讨论】:

比接受的答案好多了!但是,我只会使用 CamelCasePropertyNamesContractResolver;不格式化。缩进 这个答案比其他答案好。在启动时设置配置是解决此问题的更好方法。 这在 Startup.cs 中的什么位置? @DerekR 在 startup.cs 中是的【参考方案4】:

如果您只在某个特定的地方需要它而不是整个应用程序,那么您可以执行以下操作:

var objectToSerialize = new Property1 = "value1", SubOjbect = new  SubObjectId = 1 ;
var json = Newtonsoft.Json.JsonConvert.SerializeObject(data, new JsonSerializerSettings  ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver() );

应该是"property1":"value1","subOjbect":"subObjectId":1(注意嵌套属性也是从小写开始的)

【讨论】:

以上是关于返回属性名称首字母小写的 json的主要内容,如果未能解决你的问题,请参考以下文章

.net core返回json首字母小写的问题解决

ASP.NET Core中返回 json 数据首字母大小写问题

fastjson转换对象,属性首字母大小写的问题

FastJSONFastJson转换json字符串key的首字母小写变大写的解决办法

FastJSONFastJson转换json字符串key的首字母小写变大写的解决办法

避免在asp.net json响应中自动小写首字母