Skip to content
.NET 开发者指北.NET 开发者指北
CMS
.NET指北
FreeKit
Docker
关于
博客
github icon
    • 开发起步
      • Newtonsoft.Json基础问题
        • 设置下划线
          • 实现时间戳
            • 参考
            • 依赖注入scrutor
              • 认证与授权
                • 获取控制器及方法特性标签
                  • 认证鉴权状态
                    • 全局敏感词处理
                      • GitHub第三方授权登录
                        • QQ第三方授权登录
                          • CAP实现EventBus
                            • Scriban 模板语言

                            Newtonsoft.Json基础问题

                            calendar icon2020年4月15日timer icon大约 2 分钟word icon约 643 字

                            此页内容
                            • 设置下划线
                            • 实现时间戳
                            • 参考

                            # Newtonsoft.Json基础问题

                            它是.NET下的一个序列化、反序化的基础类库,更基础的用法还是看别人的吧,这里只说一些遇到的问题。

                            # 设置下划线

                            ContractResolver 默认是小驼峰,我想改成下划线方式,遇到了一些问题,dictionary的键未格式化

                            in controller 创建一个控制器

                            [HttpGet("getDictionary")]
                            public IDictionary<string, string> GetDictionary()
                            {
                                IDictionary<string, string> dics = new Dictionary<string, string>();
                            
                                dics.Add("Key", "Value");
                                dics.Add("KeyTest", "Value_Test");
                                return dics;
                            }
                            
                            1
                            2
                            3
                            4
                            5
                            6
                            7
                            8
                            9

                            In Startup.cs

                            services
                            .AddMvc()
                            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
                            .AddJsonOptions(opt =>
                            {
                                
                                // 设置下划线方式,首字母是小写
                                opt.SerializerSettings.ContractResolver = new DefaultContractResolver()
                                {
                                    NamingStrategy = new SnakeCaseNamingStrategy()
                                };
                            });
                            
                            1
                            2
                            3
                            4
                            5
                            6
                            7
                            8
                            9
                            10
                            11
                            12

                            此时运行后,得到的是Key,而不是key,我想他的键都变成下划线方式的小写

                            {
                              "Key": "Value",
                              "KeyTest": "Value_Test"
                            }
                            
                            1
                            2
                            3
                            4

                            其他测试,增加多级,测试正常

                            [HttpGet("get")]
                            public dynamic Get()
                            {
                             return new {
                                        Content = new {
                                            Url=Request.Path.Value,
                                            NewUrlTest="test in new url test"
                                        }
                                    };
                            }
                            
                            1
                            2
                            3
                            4
                            5
                            6
                            7
                            8
                            9
                            10

                            此时运行后,满足要求,多层结构也不会影响

                            {
                              "content": {
                                "url": "/test/get",
                                "new_url_test": "test in new url test"
                              }
                            }
                            
                            
                            1
                            2
                            3
                            4
                            5
                            6
                            7

                            看了Newtonsoft.Json的github,并在in this repository 搜索Dictionary,看issues中的配置项如下即可满足dictionary的键也转小写, ProcessDictionaryKeys 功能:A flag indicating whether dictionary keys should be processed. Defaults to false.

                            services
                            .AddMvc()
                            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
                            .AddJsonOptions(opt =>
                            {
                                
                                // 设置下划线方式,首字母是小写
                                opt.SerializerSettings.ContractResolver = new DefaultContractResolver()
                                {
                                    NamingStrategy = new SnakeCaseNamingStrategy
                                    {
                                        ProcessDictionaryKeys = true
                                    }
                                };
                            });
                            
                            1
                            2
                            3
                            4
                            5
                            6
                            7
                            8
                            9
                            10
                            11
                            12
                            13
                            14
                            15
                            {
                              "key": "Value",
                              "key_test": "Value_Test"
                            }
                            
                            1
                            2
                            3
                            4

                            # 实现时间戳

                            前台要的格式为 1562904163734,只有一个数字,我搜索了一下,也没找到相关的文档,本身这个类库有一些时间戳,不过他们都包含特殊字符,如/Date(1562904163734)/,好像类似这样,他好像在逗我,为啥他要加Date,怕是有毒吧。看到 他有Converters属性可配置,即配置自己的序列化返回格式。

                            services.AddMvc()
                            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
                            .AddJsonOptions(opt =>
                            {
                                //opt.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:MM:ss";
                                //设置时间戳格式
                                opt.SerializerSettings.Converters = new List<JsonConverter>()
                                {
                                    new LinCmsTimeConverter()
                                };
                            });
                            
                            1
                            2
                            3
                            4
                            5
                            6
                            7
                            8
                            9
                            10
                            11

                            这里的时间戳是毫秒级别

                            /// <summary>
                            /// 配合LinCMS中的时间戳 后台只返回 1562904163734
                            /// </summary>
                            public class LinCmsTimeConverter : DateTimeConverterBase
                            {
                                public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
                                {
                                    double javaScriptTicks = 0;
                                    if (value is DateTime dateTime)
                                    {
                                        javaScriptTicks = ConvertDateTimeInt(dateTime);
                                    }
                                    else
                                    {
                                        if (!(value is DateTimeOffset dateTimeOffset))
                                            throw new JsonSerializationException("Expected date object value.");
                                        javaScriptTicks = ConvertDateTimeInt(dateTimeOffset.ToUniversalTime().UtcDateTime);
                            
                                    }
                                    writer.WriteValue(javaScriptTicks);
                                }
                            
                                public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
                                {
                                    return ConvertIntDateTime(double.Parse(reader.Value.ToString()));
                                }
                                
                                /// <summary>
                                /// 日期转换为时间戳(时间戳单位毫秒)
                                /// </summary>
                                /// <param name="TimeStamp"></param>
                                /// <returns></returns> 
                                public static DateTime ConvertIntDateTime(double milliseconds)
                                {
                                    return new DateTime(1970, 1, 1).AddMilliseconds(milliseconds);
                                }
                            
                            
                                public static double ConvertDateTimeInt(DateTime aDt)
                                {
                                    return (aDt - new DateTime(1970, 1, 1)).TotalMilliseconds;
                                }
                            }
                            
                            1
                            2
                            3
                            4
                            5
                            6
                            7
                            8
                            9
                            10
                            11
                            12
                            13
                            14
                            15
                            16
                            17
                            18
                            19
                            20
                            21
                            22
                            23
                            24
                            25
                            26
                            27
                            28
                            29
                            30
                            31
                            32
                            33
                            34
                            35
                            36
                            37
                            38
                            39
                            40
                            41
                            42
                            43

                            # 参考

                            • https://github.com/JamesNK/Newtonsoft.Json/issues/2088open in new window
                            • https://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_Serialization_NamingStrategy_ProcessDictionaryKeys.htmopen in new window
                            • https://blog.csdn.net/yw1688/article/details/38492583open in new window
                            • https://www.jianshu.com/p/c53b1a2a121dopen in new window
                            edit icon在 GitHub 上编辑此页open in new window
                            上次编辑于: 2022/9/13 11:34:29
                            贡献者: igeekfan,luoyunchong
                            上一页
                            开发起步
                            下一页
                            依赖注入scrutor
                            MIT Licensed | Copyright © 2021-present luoyunchong
                            苏ICP备16046457号-1

                            该应用可以安装在你的 PC 或移动设备上。这将使该 Web 应用程序外观和行为与其他应用程序相同。它将在出现在应用程序列表中,并可以固定到主屏幕,开始菜单或任务栏。此 Web 应用程序还将能够与其他应用程序和你的操作系统安全地进行交互。

                            详情