.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!
推薦閱讀:
- C# Newtonsoft.Json 解析多嵌套json 進行反序列化的實例
- @RequestBody不能映射到對象的解決
- Springboot下swagger-ui.html訪問不到的解決方案
- springboot jackson自定義序列化和反序列化實例
- c# Newtonsoft.Json 常用方法總結