溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

.Net自定義轉(zhuǎn)換器JsonConverter如何使用

發(fā)布時(shí)間:2023-04-25 17:24:35 來(lái)源:億速云 閱讀:114 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇“.Net自定義轉(zhuǎn)換器JsonConverter如何使用”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“.Net自定義轉(zhuǎn)換器JsonConverter如何使用”文章吧。

場(chǎng)景描述

例如api返回了以下json串 (infcode的值有可能時(shí)string 也可能時(shí)number

有時(shí)候返回時(shí)這個(gè)
{
	"infcode": -1,
	"detail_msg": null
}

有時(shí)后也可能時(shí)這個(gè)
 
{
	"infcode": "-1",
	"detail_msg": null
}

本人之前在springboot開(kāi)發(fā)的時(shí)候,使用的是fastjson,所以,只要在實(shí)體類(lèi)定義屬性為String,那么無(wú)論是number還是字符串,都會(huì)轉(zhuǎn)換成String.

但是,到了.netcore這邊的就不太管用了. 如果實(shí)體類(lèi)定義是string, json字段是number的話(huà).會(huì)拋出異常The JSON value could not be converted to System.String

默認(rèn)的反序列的寫(xiě)法 (以下),會(huì)報(bào)錯(cuò),不能直接將number轉(zhuǎn)成string

實(shí)體類(lèi)變量= JsonSerializer.Deserialize<實(shí)體類(lèi)類(lèi)型>(jsonString);

要想實(shí)現(xiàn)無(wú)論是number還是字符串, 都能夠反序列化成功的話(huà).這里就需要用到JsonConverter來(lái)實(shí)現(xiàn)了.這里介紹兩種比較直觀的寫(xiě)法

  • 通過(guò)JsonSerializerOptions參數(shù),綁定JsonConverter來(lái)實(shí)現(xiàn)

  • 在實(shí)體類(lèi)的屬性上 增加JsonConverter注解來(lái)實(shí)現(xiàn) (不確定在C#是不是叫注解,在java中是叫注解)

通過(guò)JsonSerializerOptions參數(shù),綁定JsonConverter來(lái)實(shí)現(xiàn)

  • 這里新建一個(gè)類(lèi),例如取名為IntJsonConverter.cs .讓其繼承JsonConverter.

  • 然后重寫(xiě)Read方法.

  • 下面是關(guān)鍵部分代碼

public class IntJsonConverter : JsonConverter<string>  //這里因?yàn)閷?shí)體類(lèi)的屬性是string 這里就配置儲(chǔ)層string
    {
        public override string? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
	
            if (reader.TokenType == JsonTokenType.Number)
            {
		//這里就簡(jiǎn)單處理以下 如果時(shí)number, 轉(zhuǎn)換為decimal后在toString即可
                return reader.GetDecimal().ToString();
            }
            else
            {
                return reader.GetString();
            }
        }     
    }

4.然后再需要轉(zhuǎn)換的地方 配置以下反序列化的選項(xiàng)JsonSerializerOptions

 var serializeOptions = new JsonSerializerOptions
 {
 	WriteIndented = true,
 };
serializeOptions.Converters.Add(new IntJsonConverter());
fsiResponse = JsonSerializer.Deserialize<FsiResponse>(contentStream, serializeOptions);

5.這樣就可以了

在實(shí)體類(lèi)的屬性上 增加JsonConverter注解來(lái)實(shí)現(xiàn)

  • 同樣需要自定義一個(gè)JsonConverter類(lèi) ,同剛才的步驟.

  • 在實(shí)體類(lèi)上,增加注解,只向這個(gè)轉(zhuǎn)換器

 public class FsiResponse
    {
        [JsonConverter(typeof(IntJsonConverter))]
        public string? infcode { get; set; }

3.然后反序列化的時(shí)候, 按照默認(rèn)的寫(xiě)法即可

fsiResponse = JsonSerializer.Deserialize<FsiResponse>(contentStream);

以上就是關(guān)于“.Net自定義轉(zhuǎn)換器JsonConverter如何使用”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI