欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# Newtonsoft自定義JsonConverter的實現(xiàn)

 更新時間:2025年03月20日 08:58:46   作者:likepoems  
本文介紹了在C#中使用Newtonsoft庫進行JSON對象和字符串的序列化與反序列化,具有一定的參考價值,感興趣的可以了解一下

在C#中,我們使用Newtonsoft來對JSON對象或字段串進行序列化和反序列化的操作,但在某些場景下,需要在映射過程中需要對屬性進行更改。

1、JsonProperty

JsonProperty用于指定特定字段的名稱,將一個字段指定為另一個字段,示例如下:

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);

這時jsonstr的值就是{“用戶名”:“Tom”,“年齡”:20};
但是這會有個問題,json對象的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 是一個泛型的類,繼承JsonConverter,用于在 JSON 序列化和反序列化過程中,將 JSON 中的字段名從中文名稱映射到 C# 對象的屬性名,或者反過來將 C# 對象的屬性名映射為中文名稱。

  • 該類通過自定義特性 [NameAttribute] 來對類的屬性進行標(biāo)記,并指定它的中文名稱,如果沒有標(biāo)記,則使用本身的屬性。

  • CanConvert:判斷當(dāng)前轉(zhuǎn)換器是否適用于指定的類型 T。
    ReadJson:在反序列化時,將 JSON 數(shù)據(jù)轉(zhuǎn)換為 C# 對象。根據(jù) [NameAttribute] 的中文名稱找到對應(yīng)的屬性并賦值。
    WriteJson:在序列化時,將 C# 對象轉(zhuǎn)換為 JSON 數(shù)據(jù)。根據(jù) [NameAttribute] 的中文名稱生成對應(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對象:
Name:Tom
Age: 20

到此這篇關(guān)于C# Newtonsoft自定義JsonConverter的實現(xiàn)的文章就介紹到這了,更多相關(guān)C# 自定義JsonConverter內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#下listview如何插入圖片

    C#下listview如何插入圖片

    這篇文章主要為大家詳細(xì)介紹了C#下listview如何插入圖片,如何在listview中插入圖片的每一個步驟為大家分享,感興趣的朋友可以參考一下
    2016-05-05
  • Silverlight實現(xiàn)跑馬燈動畫

    Silverlight實現(xiàn)跑馬燈動畫

    這篇文章主要為大家詳細(xì)介紹了Silverlight實現(xiàn)跑馬燈動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • C#隊列Queue多線程用法實例

    C#隊列Queue多線程用法實例

    這篇文章主要介紹了C#隊列Queue多線程用法,實例分析了隊列的相關(guān)使用技巧,需要的朋友可以參考下
    2015-05-05
  • C# 創(chuàng)建EXCEL圖表并保存為圖片的實例

    C# 創(chuàng)建EXCEL圖表并保存為圖片的實例

    下面小編就為大家分享一篇C# 創(chuàng)建EXCEL圖表并保存為圖片的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • C#使用 Salt + Hash 來為密碼加密

    C#使用 Salt + Hash 來為密碼加密

    本文主要介紹了幾種常見的破解密碼的方法,為密碼加鹽(Salt)以及在.NET中的實現(xiàn)等。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • C#Button窗體常用屬性及事件詳解

    C#Button窗體常用屬性及事件詳解

    在本篇文章里小編給各位分享的是關(guān)于C#Button窗體常用屬性及事件詳解,需要的朋友們可以參考下。
    2020-03-03
  • C#中的延時函數(shù)sleep

    C#中的延時函數(shù)sleep

    這篇文章主要介紹了C#中的延時函數(shù)sleep用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • C#實現(xiàn)圖像選擇驗證碼的示例代碼

    C#實現(xiàn)圖像選擇驗證碼的示例代碼

    為了防止網(wǎng)站被非法登陸,網(wǎng)站一般通過驗證碼的方式,防止黑客用軟件非法登陸,本文主要介紹了C#實現(xiàn)圖像選擇驗證碼的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • c#和sql如何獲得時間間隔的方法

    c#和sql如何獲得時間間隔的方法

    這篇文章主要介紹了c#和sql如何獲得時間間隔的方法,有需要的朋友可以參考一下
    2013-12-12
  • C#實現(xiàn)動態(tài)創(chuàng)建接口并調(diào)用的實例

    C#實現(xiàn)動態(tài)創(chuàng)建接口并調(diào)用的實例

    這篇文章介紹了C#實現(xiàn)動態(tài)創(chuàng)建接口并調(diào)用,文中通過實例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11

最新評論