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

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

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

在C#中,我們使用Newtonsoft來(lái)對(duì)JSON對(duì)象或字段串進(jìn)行序列化和反序列化的操作,但在某些場(chǎng)景下,需要在映射過(guò)程中需要對(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è)問(wèn)題,json對(duì)象的Name和Age都是null;
原因是指定的字段名不匹配,也就是說(shuō)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;
    }
}

說(shuō)明:

  • JsonToChineseConverter 是一個(gè)泛型的類(lèi),繼承JsonConverter,用于在 JSON 序列化和反序列化過(guò)程中,將 JSON 中的字段名從中文名稱映射到 C# 對(duì)象的屬性名,或者反過(guò)來(lái)將 C# 對(duì)象的屬性名映射為中文名稱。

  • 該類(lèi)通過(guò)自定義特性 [NameAttribute] 來(lái)對(duì)類(lèi)的屬性進(jìn)行標(biāo)記,并指定它的中文名稱,如果沒(méi)有標(biāo)記,則使用本身的屬性。

  • CanConvert:判斷當(dāng)前轉(zhuǎn)換器是否適用于指定的類(lèi)型 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)文章

  • C#實(shí)現(xiàn)應(yīng)用程序的監(jiān)控與調(diào)試的示例代碼

    C#實(shí)現(xiàn)應(yīng)用程序的監(jiān)控與調(diào)試的示例代碼

    日志記錄是軟件開(kāi)發(fā)中不可或缺的功能,它能幫助開(kāi)發(fā)者在應(yīng)用程序運(yùn)行時(shí)記錄重要信息,本文就來(lái)介紹一下常用日志記錄功能以及常用的日志庫(kù),感興趣的可以了解一下
    2024-03-03
  • WPF使用DrawingContext實(shí)現(xiàn)繪制刻度條

    WPF使用DrawingContext實(shí)現(xiàn)繪制刻度條

    這篇文章主要為大家詳細(xì)介紹了如何利用WPF DrawingContext實(shí)現(xiàn)繪制刻度條,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下
    2022-09-09
  • C#使用WebSocket實(shí)現(xiàn)聊天室功能

    C#使用WebSocket實(shí)現(xiàn)聊天室功能

    這篇文章主要為大家詳細(xì)介紹了C#使用WebSocket實(shí)現(xiàn)聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • c# WPF中System.Windows.Interactivity的使用

    c# WPF中System.Windows.Interactivity的使用

    這篇文章主要介紹了c# WPF中System.Windows.Interactivity的使用,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • 深入C#中使用SqlDbType.Xml類(lèi)型參數(shù)的使用詳解

    深入C#中使用SqlDbType.Xml類(lèi)型參數(shù)的使用詳解

    本篇文章是對(duì)在C#中使用SqlDbType.Xml類(lèi)型參數(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C#配置文件Section節(jié)點(diǎn)處理總結(jié)

    C#配置文件Section節(jié)點(diǎn)處理總結(jié)

    這篇文章主要介紹了C#配置文件Section節(jié)點(diǎn)處理總結(jié),針對(duì)配置文件Section節(jié)點(diǎn)的處理做了較為詳細(xì)的實(shí)例總結(jié),需要的朋友可以參考下
    2014-10-10
  • C#實(shí)現(xiàn)事件總線的方法示例

    C#實(shí)現(xiàn)事件總線的方法示例

    事件總線是一種用于在應(yīng)用程序內(nèi)部或跨應(yīng)用程序組件之間進(jìn)行事件通信的機(jī)制,本文主要介紹了C#實(shí)現(xiàn)事件總線的方法示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • 詳解C# IComparable和IComparer接口和自定義比較器

    詳解C# IComparable和IComparer接口和自定義比較器

    本文主要介紹了詳解C# IComparable和IComparer接口和自定義比較器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-07-07
  • Unity常用命令模式詳解

    Unity常用命令模式詳解

    這篇文章主要為大家詳細(xì)介紹了Unity常用命令模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C#特性-對(duì)象集合初始化器介紹

    C#特性-對(duì)象集合初始化器介紹

    在寫(xiě)一些實(shí)體類(lèi)的時(shí)候,我們往往在寫(xiě)構(gòu)造方法的時(shí)候思考很長(zhǎng)時(shí)間,除了一個(gè)無(wú)參構(gòu)造器外還在想需要寫(xiě)幾個(gè)構(gòu)造器呢?哪些參數(shù)是需要初始化的?,F(xiàn)在你再也不需要為這事煩惱了
    2014-12-12

最新評(píng)論