应无所住,而生其心
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

.net core webapi json相关,全局配置,时间格式化,首字母小写等

8561人阅读 2019/11/13 12:07 总访问:4811814 评论:0 收藏:0 手机
分类: .NET Core


在ConfigureServices中可以进行全局json配置,例如,全局处理一下事件格式问题

services.AddMvc(option =>
{
    //option.Filters.Add(typeof(VisitorLogFilter));//全局注册ServiceFilter
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2).AddJsonOptions(options =>
{
    // 格式化json输出的日期格式
    options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
    //options.SerializerSettings.ContractResolver = new DefaultContractResolver
    //{
    //    NamingStrategy = new SnakeCaseNamingStrategy()  // json属性名下划线命名方式
    //};
});

特性的方式改变日期格式(适合需要特殊处理日期格式的地方):

 public class NewtonsoftDateConverter : IsoDateTimeConverter
    {
        public NewtonsoftDateConverter()
        {
            base.DateTimeFormat = "yyyy-MM-dd";
        }
    }

使用:

[JsonConverter(typeof(NewtonsoftDateConverter))]
public Nullable<System.DateTime> CreateTime { get; set; }


上面的写法是比较老的写法了,比较新一些的写法可以参考:
.net core 3.0+ json时间格式化 ,全局配置json时间序列化格式 - 忆点点的专栏 - TNBLOG
https://www.tnblog.net/aojiancc/article/details/3347

修改命名规则

配置首字母小写,其余大写按驼峰命名法

//按驼峰命名法(首字母小写,其余的单词首字母都是大写)
options.SerializerSettings.ContractResolver =  new CamelCasePropertyNamesContractResolver();

默认命名规则(不改变任何字符的情况下序列化)

//默认命名规则(不改变任何字符的情况下序列化)
options.SerializerSettings.ContractResolver = new DefaultContractResolver();

如果你想要自己定义一种命名规范,例如全部是小写可以重写DefaultContractResolver即可

public class LowerCasePropertyNamesContractResolver : DefaultContractResolver
{
   protected override string ResolvePropertyName(string propertyName)
   {
       return propertyName.ToLower();
   }
}


通过Newtonsoft.Json实现动态修改名字

有时候我们想要给不同的用户或者客户端提供不同的名字,又比如不同前台的组件需要不同格式的数据,我们可以动态的修改名字就不用为每个都重新定义一个新的模型。

和修改返回字段一样的去重写DefaultContractResolver

public class PropsContractResolver : DefaultContractResolver
{
    Dictionary<string, string> dict_props = null;

    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="props">传入的属性数组</param>
    public PropsContractResolver(Dictionary<string, string> dictPropertyName)
    {
        //指定字段要序列化成什么名称
        this.dict_props = dictPropertyName;
    }

    protected override string ResolvePropertyName(string propertyName)
    {
        string newPropertyName = string.Empty;
        if (dict_props != null && dict_props.TryGetValue(propertyName, out newPropertyName))
        {
            return newPropertyName;
        }
        else
        {
            //没有找到就用原来的
            return base.ResolvePropertyName(propertyName);
        }
    }
}

使用:

JsonSerializerSettings jsetting = new JsonSerializerSettings();
//jsetting.ContractResolver = new LimitPropsContractResolver(new string[] { "title", "aClass" }, LimitType.Contains);
Dictionary<string, string> dictProp = new Dictionary<string, string> { { "Id", "MyId" }, { "Title", "MyTitle" } };
jsetting.ContractResolver = new PropsContractResolver(dictProp);
string jsonstr = JsonConvert.SerializeObject(art, Formatting.Indented, jsetting);

这里我们把Id修改成了MyId,Title修改成了MyTitle


net core api中默认使用的是Newtonsoft.Json,关于net core api中Newtonsoft.Json的更多用法可以参考:

http://www.tnblog.net/aojiancc2/article/details/2828

欢迎加群讨论技术,群:677373950(满了,可以加,但通过不了),2群:656732739

评价