这篇“.Net自定义转换器JsonConverter如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“.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中是叫注解)
这里新建一个类,例如取名为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类 ,同刚才的步骤.
在实体类上,增加注解,只向这个转换器
public class FsiResponse { [JsonConverter(typeof(IntJsonConverter))] public string? infcode { get; set; }
3.然后反序列化的时候, 按照默认的写法即可
fsiResponse = JsonSerializer.Deserialize<FsiResponse>(contentStream);
以上就是关于“.Net自定义转换器JsonConverter如何使用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。