返回属性名称首字母小写的 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的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core中返回 json 数据首字母大小写问题
FastJSONFastJson转换json字符串key的首字母小写变大写的解决办法