前言
序列化大家都很常見,就是把一個對象序列化成一串Json 字符串。最近對接第三方的時候遇到了一個情況,我們C#都是用駱駝命名,而他們呢需要接收的Json字符串的 key 是 小寫 的這時候要怎么處理呢!話不多說直接上代碼開干
定義一個 Map 類
using Newtonsoft.Json; using System; namespace JsonLower { public class Map { [JsonProperty("id")] public Guid ID { get; set; } [JsonProperty("code")] public string Code { get; set; } [JsonProperty("name")] public string Name { get; set; } } }
主程序初始化數據轉Json字符串
using Newtonsoft.Json; using System; using System.Collections.Generic; namespace JsonLower { class Program { static void Main(string[] args) { List<Map> maps = new List<Map>() { new Map{ ID = Guid.NewGuid(), Code = "MD0001", Name = "小明" }, new Map{ ID = Guid.NewGuid(), Code = "MD0002", Name = "小紅" }, new Map{ ID = Guid.NewGuid(), Code = "MD0003", Name = "張三" }, }; var jsonStr = JsonConvert.SerializeObject(maps); Console.WriteLine(jsonStr); Console.ReadLine(); } } }
看下效果
在屬性上使用了 JsonProperty 特性,使得序列化時根據 JsonProperty 特性傳入的字符串進行序列化,那我們有時候想忽略掉 JsonProperty 特性
using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace JsonLower { /// <summary> /// Json 序列化 /// </summary> public class JsonHelper { /// <summary> /// 序列化是否按照JsonProperty顯示Key /// </summary> /// <param name="obj"></param> /// <param name="isJsonProperty"></param> /// <returns></returns> public static string SerializeObject(object obj, bool isJsonProperty = false) { var jsonSettings = new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore }; if (isJsonProperty) jsonSettings.ContractResolver = new LongNameContractResolver(); return JsonConvert.SerializeObject(obj, jsonSettings); } } public class LongNameContractResolver : DefaultContractResolver { protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { IList<JsonProperty> list = base.CreateProperties(type, memberSerialization); foreach (JsonProperty prop in list) { prop.PropertyName = prop.UnderlyingName; } return list; } } }
修改主程序代碼
using Newtonsoft.Json; using System; using System.Collections.Generic; namespace JsonLower { class Program { static void Main(string[] args) { List<Map> maps = new List<Map>() { new Map{ ID = Guid.NewGuid(), Code = "MD0001", Name = "小明" }, new Map{ ID = Guid.NewGuid(), Code = "MD0002", Name = "小紅" }, new Map{ ID = Guid.NewGuid(), Code = "MD0003", Name = "張三" }, }; //未忽略 { var jsonStr = JsonConvert.SerializeObject(maps); Console.WriteLine("未忽略JsonProperty:" + jsonStr); } { var jsonStr = JsonHelper.SerializeObject(maps,true); Console.WriteLine("忽略JsonProperty:" + jsonStr); } Console.ReadLine(); } } }
看一下效果圖
大功告成!