欢迎访问欧博网址!

首页科技正文

皇冠体育app:Newtonsoft 六个超简朴又适用的特征,值得一试 【上篇】

admin2020-08-2059

一:讲故事

看完官方文档,阅读了一些 Newtonsoft 源码,对它有了新的熟悉,先总结 六个超经典又适用的特征,同人人一起分享,空话不多说,快来一起看看吧~~~

二:特征剖析

1. 代码格式化

若是你直接使用 JsonConvert.SerializeObject的话,默认情形下所有的json是挤压在一块的,稀奇不利便阅读,如下所示:


        static void Main(string[] args)
        {
            var reportModel = new ReportModel()
            {
                ProductName = "法式小众设计感长裙气质显瘦纯白色仙女连衣裙",
                TotalPayment = 100,
                TotalCustomerCount = 2,
                TotalProductCount = 333
            };

            var json = JsonConvert.SerializeObject(reportModel);

            System.Console.WriteLine(json);
        }
    }

    public class ReportModel
    {
        public string ProductName { get; set; }
        public int TotalCustomerCount { get; set; }
        public decimal TotalPayment { get; set; }
        public int TotalProductCount { get; set; }
    }

那怎么办呢? JsonConvert中提供了一个 Formatting.Indented 用来格式化json,这样在 debug 的历程中就异常友好,革新如下:

2. 踢掉没有被赋值的字段

若是你写过给 App 提供数据的后端服务,我相信你对手机流量这个词稀奇敏感,往往一个 Model 上有十几个字段,但需要传给 App 可能就 三四个字段,这就造成了伟大的流量虚耗,如下图:


        static void Main(string[] args)
        {
            var reportModel = new ReportModel()
            {
                ProductName = "法式小众设计感长裙气质显瘦纯白色仙女连衣裙",
                TotalPayment = 100
            };

            var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented);

            System.Console.WriteLine(json);
        }

从图中可以看到,TotalCustomerCountTotalProductCount 这两个字段就没必要了,Netnewsoft 中提供了 DefaultValueHandling.Ignore 剔除默认值的枚举,太适用了,革新如下:


            var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented,
                                                   new JsonSerializerSettings
                                                   {
                                                       DefaultValueHandling = DefaultValueHandling.Ignore
                                                   });

3. 兼容其他语言的 驼峰,蛇形命名法

每一套编程语言都有各自偏好的命名法,好比 js 中都喜欢接纳 驼峰命名法,在 mysql 中我见过最多的 蛇形命名法,而我们在 C# 中序列化的属性一样平常都是大写字母开头,好比你看到的 特征二 中的字段,那这里就存在问题了,有没有设施兼容一下,给 js 就用 驼峰,给 mysql 就用 蛇形,这样显得对别人友好一些,不是嘛,接下来看看怎么革新。

  • 驼峰命名 CamelCasePropertyNamesContractResolver

            var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented,
                                                   new JsonSerializerSettings
                                                   {
                                                       ContractResolver = new CamelCasePropertyNamesContractResolver()
                                                   });

  • 蛇形命名 SnakeCaseNamingStrategy

            var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented,
                                                   new JsonSerializerSettings
                                                   {
                                                       ContractResolver = new DefaultContractResolver()
                                                       {
                                                           NamingStrategy = new SnakeCaseNamingStrategy()
                                                       }
                                                   });

4. 自界说属性的名字

若是你和第三方系统举行过对接开发,通常都市遇到这个问题,就拿 OpenTaobao 来说,我的Model总不能根据它文档这样界说吧,而且字段名称也不可能做到完全一致,如下图:

以是这内里一定要存在一个 Mapping 的历程,这就可以用 JsonProperty -> propertyName 帮你搞定,为了利便演示,我照样用 reportModel 吧。


    static void Main(string[] args)
    {
        var json = "{'title':'法式小众设计感长裙气质显瘦纯白色仙女连衣裙','customercount':1000,'totalpayment':100.0,'productcount':10000}";

        var reportModel = JsonConvert.DeserializeObject<ReportModel>(json);
    }

    public class ReportModel
    {
        [JsonProperty("title")] public string ProductName { get; set; }
        [JsonProperty("customercount")] public int TotalCustomerCount { get; set; }
        [JsonProperty("totalpayment")] public decimal TotalPayment { get; set; }
        [JsonProperty("productcount")] public int TotalProductCount { get; set; }
    }


5. 对字段的 正向剔除 和 反向剔除

可能有些同伙对这两个观点不是稀奇领会,这里我仅显示 Model 中的 ProductName 为例解说一下:

  • 正向剔除: 默认所有都显示,手工踢掉不显示的,使用 MemberSerialization.OptOut 配合 JsonIgnore

 		static void Main(string[] args)
        {
            var reportModel = new ReportModel()
            {
                ProductName = "法式小众设计感长裙气质显瘦纯白色仙女连衣裙",
                TotalPayment = 100
            };

            var json = JsonConvert.SerializeObject(reportModel, Formatting.Indented);

            System.Console.WriteLine(json);
        }

    [JsonObject(MemberSerialization.OptOut)]
    public class ReportModel
    {
        public string ProductName { get; set; }
        [JsonIgnore] public int TotalCustomerCount { get; set; }
        [JsonIgnore] public decimal TotalPayment { get; set; }
        [JsonIgnore] public int TotalProductCount { get; set; }
    }

  • 反向剔除: 默认都不显示,手工指定要显示的,使用 MemberSerialization.OptIn 配合 JsonProperty
       
    [JsonObject(MemberSerialization.OptIn)]
    public class ReportModel
    {
        [JsonProperty] public string ProductName { get; set; }
        public int TotalCustomerCount { get; set; }
        public decimal TotalPayment { get; set; }
        public int TotalProductCount { get; set; }
    }

6. 多个json 合并到 一个Model

这个特征当初打破了我对 Newtonsoft 的认知观,不知道您呢? 通常我们都市以为 一个 json 对应一个 model,一个 model 对应一个 json,居然还可以多个 json 对应一个 model 的情形,这就有意思了,场景人人可以自己想一想哈,这里使用 PopulateObject 方式就可以轻松帮你搞定,接下来看看怎么写这个代码:


        static void Main(string[] args)
        {
            var json1 = "{'ProductName':'法式小众设计感长裙气质显瘦纯白色仙女连衣裙'}";
            var json2 = "{'TotalCustomerCount':1000,'TotalPayment':100.0,'TotalProductCount':10000}";

            var reportModel = new ReportModel();

            JsonConvert.PopulateObject(json1, reportModel);
            JsonConvert.PopulateObject(json2, reportModel);
        }

是不是有点意思

三:总结

为了怕影响阅读体验,这一篇就先总结六个供人人浏览,Newtonsoft 这玩意确实异常壮大,太多的器械需要去挖掘,希望本篇对你有辅助,谢谢。

如您有更多问题与我互动,扫描下方进来吧~

,

欧博开户

欢迎进入欧博开户(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

转载声明:本站发布文章及版权归原作者所有,转载本站文章请注明文章来源!

本文链接:https://www.chinadsn9.com/post/712.html

网友评论

2条评论
  • 2020-07-02 00:09:15

    www.allbetgaming.com欢迎进入欧博平台网站(www.aLLbetgame.us),www.aLLbetgame.us开放欧博平台网址、欧博注册、欧博APP下载、欧博客户端下载、欧博游戏等业务。很现实但是不残酷

  • 2020-08-20 00:10:32

    欧博开户网址欢迎进入欧博开户网址(Allbet Gaming):www.aLLbetgame.us,欧博网址开放会员注册、代理开户、电脑客户端下载、苹果安卓下载等业务。不落俗套

最新评论

  • UG环球APP下载 09/07 说:

    欧博亚洲手机版下载欢迎进入欧博亚洲手机版下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。这里好多爽文

  • UG环球APP下载 09/07 说:

    欧博亚洲手机版下载欢迎进入欧博亚洲手机版下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。这里好多爽文

  • allbet登录官网 09/07 说:

    欧博allbet网址欢迎进入欧博allbet网址(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。就是很好很好的

  • Allbet官网 09/07 说:

    Allbet Gmaing开户欢迎进入Allbet Gmaing开户(www.aLLbetgame.us):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。从今天起,每天都来

  • UG环球电脑版下载 09/06 说:

    欧博亚洲电脑版下载欢迎进入欧博亚洲电脑版下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。再也不想打游戏了

  • UG环球注册 09/05 说:

    欧博官网手机欢迎进入欧博官网手机(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。看文居然成瘾,哈哈

  • AllbetGmaing官网 09/04 说:

    www.allbetgaming.net欢迎进入欧博平台网站(www.aLLbetgame.us),www.aLLbetgame.us开放欧博平台网址、欧博注册、欧博APP下载、欧博客户端下载、欧博游戏等业务。盼着更新呢

  • UG环球手机版下载 09/04 说:

    欧博开户欢迎进入欧博开户(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。看起来很好哦。