当前位置: 代码网 > it编程>编程语言>Asp > .Net 自定义转换器JsonConverter的使用详解

.Net 自定义转换器JsonConverter的使用详解

2024年05月15日 Asp 我要评论
参考官方文档场景描述例如api返回了以下json串 (infcode的值有可能时string 也可能时number有时候返回时这个{"infcode": -1,"detail_msg": null}有

参考官方文档

场景描述

例如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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com