1. 程式人生 > 其它 >織夢dedecms響應式甜點西餐廳企業網站模板(自適應手機移動端)

織夢dedecms響應式甜點西餐廳企業網站模板(自適應手機移動端)

織夢dedecms響應式甜點西餐廳企業網站模板(自適應手機移動端)

本程式採用一庫兩站簡潔方便管理後臺,一個後臺管理兩網站,電腦版+手機版

1、網站手工DIV+css,程式碼精簡,首頁排版整潔大方、佈局合理、利於SEO、圖文並茂、靜態html;
2、程式自帶XML地圖,有利於搜尋引擎快速收錄和排名

檔案:n459.com/file/25127180-478850065

以下內容無關:

-------------------------------------------分割線---------------------------------------------

前言
專案開發中不管是前臺還是後臺都會遇到煩人的null,資料庫表中欄位允許空值,則程式碼實體類中對應的欄位型別為可空型別Nullable<>,如int?,DateTime?,null值欄位序列化返回的值都為null,前臺對應欄位賦值需要做null值判斷,怎麼才能全域性把null替換為空。

  本文分享WebAPI介面服務統一返回null替換為空的方法。

一、分析問題
.NET Core中使用Newtonsoft.Json進行序列化,WebAPI介面返回格式通過Startup.cs類全域性設定。想是否可以通過配置把null替換為空值?於是找到了Newtonsoft.Json在序列化和反序列化期間如何處理空值和預設值的屬性,具體配置程式碼如下:

複製程式碼
1 public void ConfigureServices(IServiceCollection services)
2 {
3 //配置Mvc + json 序列化
4 services.AddMvc()
5 .AddNewtonsoftJson(options =>

6 {
7 //資料格式首字母小寫 不使用駝峰 小駝峰firstName 大駝峰 FirstName
8 options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
9 //使用預設方式,不更改元資料的key的大小寫
10 //options.SerializerSettings.ContractResolver = new DefaultContractResolver();
11 // 忽略迴圈引用
12 options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
13 // 設定時間格式
14 options.SerializerSettings.DateFormatString = “yyyy-MM-dd HH:mm:ss”;
15 //忽略空值 不包含屬性的null序列化
16 //options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
17 //忽略預設值和null 1、不包含屬性預設值和null
18 //options.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Igno
19 })
20 }
複製程式碼
1、空值的處理

  序列化和反序列化時需要忽略值為null的屬性,設定SerializerSettings.NullValueHandling的值

NullValueHandling.Ignore 序列化和反序列化物件時忽略空值。
NullValueHandling.Include 序列化和反序列化物件時包含空值。
2、預設值的處理

  序列化和反序列化時需要忽略預設值屬性,設定SerializerSettings.DefaultValueHandling的值

DefaultValueHandling.Ignore 序列化和反序列化時忽略預設值
DefaultValueHandling.Include序列化和反序列化時包含預設值
3、示例程式碼

複製程式碼
1 /包含屬性的預設值與null序列化/
2 {
3 “Name”: null,
4 “Age”: 0,
5 “Partner”: null,
6 “Salary”: 0.0
7 }
8 /不包含屬性的預設值序列化/
9 {
10 “Name”: “Hello World”,
11 “Age”: 28
12 }
13 /不包含屬性的null序列化/
14 {
15 “Name”: “Hello World”,
16 “Age”: 28,
17 “Salary”: 0.0
18 }
複製程式碼
通過上面的分析:一種是不包含屬性的預設值序列化,另一種是不包含屬性的null序列化,都不能滿足目前的需求介面統一返回的null序列化為空。

二、解決問題
1、專案WebAPI預設返回的JSON結果格式如下:

複製程式碼
1 {
2 “code”: 0,
3 “msg”: “查詢成功”,
4 “data”: {
5 “id”: 1,
6 “title”: “炎炎夏日暖暖肚”,
7 “describe”: “”,
8 “author”: null,
9 “authorId”: null,
10 “linkSource”: null,
11 “author_Picture”: null,
12 “content”: “炎炎夏日,很多人喜歡吃些寒涼的食物解暑,可這種做法非常傷身。”,
13 }
14 }
複製程式碼
2、需要解決的問題把所有的null替換為空,具體如下圖所示:

3、解決方案

  需要自己寫一個NullToEmptyStringResolver類,然後重寫CamelCasePropertyNamesContractResolver,但是該方法只能解決string型別null→""的問題,對其他可空型別無效,比如:int?、DateTime?等。

複製程式碼
1 public class NullToEmptyStringResolver : CamelCasePropertyNamesContractResolver
2 {
3 ///
4 /// 建立屬性
5 ///
6 /// 型別
7 /// 序列化成員
8 ///
9 protected override IList CreateProperties(Type type, MemberSerialization memberSerialization)
10 {
11 return type.GetProperties().Select(c =>
12 {
13 var jsonProperty = base.CreateProperty(c, memberSerialization);
14 jsonProperty.ValueProvider = new NullToEmptyStringValueProvider©;
15 return jsonProperty;
16 }).ToList();
17 }
18 }
19
20 public class NullToEmptyStringValueProvider : IValueProvider
21 {
22 private readonly PropertyInfo _memberInfo;
23 ///
24 /// 建構函式
25 ///
26 ///
27 public NullToEmptyStringValueProvider(PropertyInfo memberInfo)
28 {
29 _memberInfo = memberInfo;
30 }
31
32 ///
33 /// 獲取Value
34 ///
35 ///
36 ///
37 public object GetValue(object target)
38 {
39 var result = _memberInfo.GetValue(target);
40 if (_memberInfo.PropertyType == typeof(string) && result == null)
41 result = string.Empty;
42 return result;
43 }
44
45 ///
46 /// 設定Value
47 ///
48 ///
49 ///
50 public void SetValue(object target, object value)
51 {
52 _memberInfo.SetValue(target, value);
53 }
54 }
複製程式碼
在Startup.cs程式碼裡面修改,標記為紅色的程式碼,如下所示:

複製程式碼
1 //配置MVC+JSON序列化
2 services
3 .AddMvc(options =>{options.EnableEndpointRouting = false;})
4 .AddNewtonsoftJson(options =>
5 {
6 //使用預設方式,不更改元資料的key的大小寫
7 //options.SerializerSettings.ContractResolver = new DefaultContractResolver();
8 //資料格式首字母小寫 不使用駝峰 小駝峰firstName 大駝峰 FirstName
9 //options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
10 options.SerializerSettings.ContractResolver = new NullToEmptyStringResolver();
11 // 忽略迴圈引用
12 options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
13 // 設定時間格式
14 options.SerializerSettings.DateFormatString = “yyyy-MM-dd HH:mm:ss”;
15 //忽略空值 不包含屬性的null序列化
16 //options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
17 //忽略預設值和null 1、不包含屬性預設值和null
18 //options.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Igno
19 })
複製程式碼
修改完配置,重新執行完成,實現null替換為空的效果,執行結果如下所示:

複製程式碼
1 {
2 “code”: 0,
3 “msg”: “查詢成功!”,
4 “data”: {
5 “id”: 1,
6 “title”: “炎炎夏日暖暖肚”,
7 “describe”: “”,
8 “author”: “”,
9 “authorId”: “”,
10 “linkSource”: “”,
11 “author_Picture”: “”,
12 “source”: 0,
13 “content”: “炎炎夏日,很多人喜歡吃些寒涼的食物解暑,可這種做法非常傷身。”
14 }
15 }