【问题标题】:Return json with lower case first letter of property names返回属性名称首字母小写的 json
【发布时间】: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)}";
    }
}

我该如何应用这个?

【问题讨论】:

标签: c# json asp.net-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://stackoverflow.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}}(注意嵌套属性也是从小写开始的)

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多