首页 > 其他分享 >.net 自定义转换器JsonConverter的使用

.net 自定义转换器JsonConverter的使用

时间:2023-03-21 19:34:46浏览次数:46  
标签:实体类 string 自定义 number JsonConverter 注解 net JsonSerializerOptions

参考官方文档

场景描述
例如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);
1
要想实现无论是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();
            }
        }     
    }

 


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

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


这样就可以了

在实体类的属性上 增加JsonConverter注解来实现
同样需要自定义一个JsonConverter类 ,同刚才的步骤.
在实体类上,增加注解,只向这个转换器

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

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

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

————————————————
版权声明:本文为CSDN博主「何浩翔」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

https://blog.csdn.net/gxlzhhx/article/details/128804249
原文链接:https://blog.csdn.net/gxlzhhx/article/details/128804249

标签:实体类,string,自定义,number,JsonConverter,注解,net,JsonSerializerOptions
From: https://www.cnblogs.com/wl-blog/p/17241157.html

相关文章

  • asp.net core项目依赖中project reference和Nuget Packages的关系
    如果一个项目依赖其他项目,则相当于添加了被依赖项目的NugetPackages,也就是说依赖包会被传递。比如:WebApi项目依赖Domain类库,Domain用来管理数据库上下文,那么只需要要再Do......
  • .NET Core 3 Preview 2发布,C#8更强大的模式匹配
    英文原文:​​Announcing.NETCore3Preview2​​.NETCore3Preview2发布了,此版本主要带来了C#8相关的新功能,C#8Preview2是.NETCore3SDK的一部分。C#8......
  • Kubernetes(k8s) 咻咻咻
    #1.k8s集群架构组件#master节点*apiservice集群统一入口,以restful方式,交给etcd存储*scheduler节点调度,选择node节点进行部署*controller-manager处理集群中常规的后台......
  • kubernetes ingress金丝雀发布/灰度发布
    1.金丝雀发布介绍灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/Btesting,即让一部分用户继续用产品特性A,一部分用户开始用产品特......
  • kubernetes ingress 蓝绿发布
    1.蓝绿发布介绍蓝绿发布就是现网运行的业务在系统1,计划升级的版本部署了系统2。新版本的系统2部署出来以后将进行充分的测试、验证。通过之后,将业务切换到系统2,即完成了......
  • kubernetes 集群环境搭建 (kubeadm方式)
    1、前置知识点目前生产部署Kubernetes集群主要有两种方式:(1)kubeadmKubeadm是一个K8s部署工具,提供kubeadminit和kubeadmjoin,用于快速部署Kubernetes集群。官方地......
  • netty网络框架一
    一、netty是什么Netty是一个高性能、异步事件驱动的网络应用程序框架,使用Java编写。它提供了一组简单但功能强大的抽象,使得开发人员可以轻松地开发基于网络协议的客户......
  • 论文翻译:2023_THLNet: two-stage heterogeneous lightweight network for monaural sp
    论文地址:THLNet:用于单耳语音增强的两级异构轻量级网络代码:https://github.com/dangf15/THLNet引用格式:DangF,HuQ,ZhangP.THLNet:two-stageheterogeneouslight......
  • docker部署Apollo系列(.net Core 连接读取)
    Docker部署Apollo 简单介绍:统一管理不同环境、不同集群的配置Apollo提供了一个统一界面集中式管理不同环境(environment)、不同集群(cluster)、不同命名空间(namespace......
  • .Net 6.0中使用JWT加密
    准备工作:在步入正题之前我们首先要对JWT加密有个初步的概念和认识,并对其原理有一定的理解,这样才能使我们在.Net6.0中更快的上手JWT加密,下面是我整理JWT加密的一些资料......