经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JSON » 查看文章
.Net 自定义转换器JsonConverter的使用详解
来源:jb51  时间:2023/4/26 8:50:02  对本文有异议

参考官方文档

场景描述

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

  1. 有时候返回时这个
  2. {
  3. "infcode": -1,
  4. "detail_msg": null
  5. }
  6.  
  7. 有时后也可能时这个
  8. {
  9. "infcode": "-1",
  10. "detail_msg": null
  11. }

本人之前在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方法.
  • 下面是关键部分代码
  1. public class IntJsonConverter : JsonConverter<string> //这里因为实体类的属性是string 这里就配置储层string
  2. {
  3. public override string? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
  4. {
  5. if (reader.TokenType == JsonTokenType.Number)
  6. {
  7. //这里就简单处理以下 如果时number, 转换为decimal后在toString即可
  8. return reader.GetDecimal().ToString();
  9. }
  10. else
  11. {
  12. return reader.GetString();
  13. }
  14. }
  15. }

4.然后再需要转换的地方 配置以下反序列化的选项JsonSerializerOptions

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

5.这样就可以了

在实体类的属性上 增加JsonConverter注解来实现

  • 同样需要自定义一个JsonConverter类 ,同刚才的步骤.
  • 在实体类上,增加注解,只向这个转换器
  1. public class FsiResponse
  2. {
  3. [JsonConverter(typeof(IntJsonConverter))]
  4. public string? infcode { get; set; }

3.然后反序列化的时候, 按照默认的写法即可

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

到此这篇关于.Net 自定义转换器JsonConverter的使用详解的文章就介绍到这了,更多相关.net 自定义转换器JsonConverter内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号