.Net 自定義轉換器JsonConverter的使用詳解

參考官方文檔

場景描述

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

有時候返回時這個
{
	"infcode": -1,
	"detail_msg": null
}

有時後也可能時這個
 
{
	"infcode": "-1",
	"detail_msg": null
}

本人之前在springboot開發的時候,使用的是fastjson,所以,隻要在實體類定義屬性為String,那麼無論是number還是字符串,都會轉換成String.

但是,到瞭.netcore這邊的就不太管用瞭. 如果實體類定義是string, json字段是number的話.會拋出異常The JSON value could not be converted to System.String

默認的反序列的寫法 (以下),會報錯,不能直接將number轉成string

實體類變量= JsonSerializer.Deserialize<實體類類型>(jsonString);

要想實現無論是number還是字符串, 都能夠反序列化成功的話.這裡就需要用到JsonConverter來實現瞭.這裡介紹兩種比較直觀的寫法

  • 通過JsonSerializerOptions參數,綁定JsonConverter來實現
  • 在實體類的屬性上 增加JsonConverter註解來實現 (不確定在C#是不是叫註解,在java中是叫註解)

通過JsonSerializerOptions參數,綁定JsonConverter來實現

  • 這裡新建一個類,例如取名為IntJsonConverter.cs .讓其繼承JsonConverter.
  • 然後重寫Read方法.
  • 下面是關鍵部分代碼
public class IntJsonConverter : JsonConverter<string>  //這裡因為實體類的屬性是string 這裡就配置儲層string
    {
        public override string? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
	
            if (reader.TokenType == JsonTokenType.Number)
            {
		//這裡就簡單處理以下 如果時number, 轉換為decimal後在toString即可
                return reader.GetDecimal().ToString();
            }
            else
            {
                return reader.GetString();
            }
        }     
    }

4.然後再需要轉換的地方 配置以下反序列化的選項JsonSerializerOptions

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

5.這樣就可以瞭

在實體類的屬性上 增加JsonConverter註解來實現

  • 同樣需要自定義一個JsonConverter類 ,同剛才的步驟.
  • 在實體類上,增加註解,隻向這個轉換器
 public class FsiResponse
    {
        [JsonConverter(typeof(IntJsonConverter))]
        public string? infcode { get; set; }

3.然後反序列化的時候, 按照默認的寫法即可

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

到此這篇關於.Net 自定義轉換器JsonConverter的使用詳解的文章就介紹到這瞭,更多相關.net 自定義轉換器JsonConverter內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: