C# Newtonsoft自定義JsonConverter的實(shí)現(xiàn)
在C#中,我們使用Newtonsoft來對(duì)JSON對(duì)象或字段串進(jìn)行序列化和反序列化的操作,但在某些場(chǎng)景下,需要在映射過程中需要對(duì)屬性進(jìn)行更改。
1、JsonProperty
JsonProperty用于指定特定字段的名稱,將一個(gè)字段指定為另一個(gè)字段,示例如下:
public class UserInfo { [JsonProperty("用戶名")] public string Name { get; set; } [JsonProperty("年齡")] public string Age { get; set; } } var tom = new UserInfo{Name = 'Tom', Age = 20}; var jsonstr = JsonConvert.SerializeObject(tom); var json = JsonConvert.DeserializeObject<UserInfo>(jsonstr);
這時(shí)jsonstr的值就是{“用戶名”:“Tom”,“年齡”:20};
但是這會(huì)有個(gè)問題,json對(duì)象的Name和Age都是null;
原因是指定的字段名不匹配,也就是說json字符串中字段名要與JsonProperty的值相同才能正確的映射。
2、自定義JsonConverter
public class JsonToChineseConverter<T> : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(T); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject jsonObject = JObject.Load(reader); T targetObject = (T)Activator.CreateInstance(objectType); foreach (var property in objectType.GetProperties()) { NameAttribute nameAttribute = property.GetCustomAttribute<NameAttribute>(); string propertyName = nameAttribute != null ? nameAttribute.ChineseName : property.Name; if (jsonObject[propertyName] != null) { property.SetValue(targetObject, jsonObject[propertyName].ToObject(property.PropertyType, serializer)); } } return targetObject; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { JObject jsonObject = new JObject(); Type objectType = value.GetType(); foreach (var property in objectType.GetProperties()) { NameAttribute nameAttribute = property.GetCustomAttribute<NameAttribute>(); string propertyName = nameAttribute != null ? nameAttribute.ChineseName : property.Name; jsonObject[propertyName] = JToken.FromObject(property.GetValue(value), serializer); } jsonObject.WriteTo(writer); } } [AttributeUsage(AttributeTargets.Property)] public class NameAttribute : Attribute { public string ChineseName { get; } public NameAttribute(string chineseName) { ChineseName = chineseName; } }
說明:
JsonToChineseConverter 是一個(gè)泛型的類,繼承JsonConverter,用于在 JSON 序列化和反序列化過程中,將 JSON 中的字段名從中文名稱映射到 C# 對(duì)象的屬性名,或者反過來將 C# 對(duì)象的屬性名映射為中文名稱。
該類通過自定義特性 [NameAttribute] 來對(duì)類的屬性進(jìn)行標(biāo)記,并指定它的中文名稱,如果沒有標(biāo)記,則使用本身的屬性。
CanConvert:判斷當(dāng)前轉(zhuǎn)換器是否適用于指定的類型 T。
ReadJson:在反序列化時(shí),將 JSON 數(shù)據(jù)轉(zhuǎn)換為 C# 對(duì)象。根據(jù) [NameAttribute] 的中文名稱找到對(duì)應(yīng)的屬性并賦值。
WriteJson:在序列化時(shí),將 C# 對(duì)象轉(zhuǎn)換為 JSON 數(shù)據(jù)。根據(jù) [NameAttribute] 的中文名稱生成對(duì)應(yīng)的 JSON 字段。
使用方法:
public class UserInfo { [Name("用戶名")] public string Name { get; set; } [Name("年齡")] public string Age { get; set; } } var tom = new UserInfo{Name = 'Tom', Age = 20}; var setting = new JsonToChineseConverter<UserInfo>(); var jsonstr = JsonConvert.SerializeObject(tom, setting); var json = JsonConvert.DeserializeObject<UserInfo>(jsonstr, setting); Console.WriteLine(jsonstr); // {"用戶名":"Tom","年齡":20}
json對(duì)象:
Name:Tom
Age: 20
到此這篇關(guān)于C# Newtonsoft自定義JsonConverter的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# 自定義JsonConverter內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Silverlight實(shí)現(xiàn)跑馬燈動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了Silverlight實(shí)現(xiàn)跑馬燈動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07C# 創(chuàng)建EXCEL圖表并保存為圖片的實(shí)例
下面小編就為大家分享一篇C# 創(chuàng)建EXCEL圖表并保存為圖片的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12C#實(shí)現(xiàn)圖像選擇驗(yàn)證碼的示例代碼
為了防止網(wǎng)站被非法登陸,網(wǎng)站一般通過驗(yàn)證碼的方式,防止黑客用軟件非法登陸,本文主要介紹了C#實(shí)現(xiàn)圖像選擇驗(yàn)證碼的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08C#實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建接口并調(diào)用的實(shí)例
這篇文章介紹了C#實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建接口并調(diào)用,文中通過實(shí)例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-11-11