.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来实现

  1. 这里新建一个类,例如取名为IntJsonConverter.cs .让其继承JsonConverter.
  2. 然后重写Read方法.
  3. 下面是关键部分代码
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();
            }
        }     
    }
  1. 然后再需要转换的地方 配置以下反序列化的选项JsonSerializerOptions

     var serializeOptions = new JsonSerializerOptions
     {
     	WriteIndented = true,
     };
    serializeOptions.Converters.Add(new IntJsonConverter());
    fsiResponse = JsonSerializer.Deserialize<FsiResponse>(contentStream, serializeOptions);
    
  2. 这样就可以了

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

  1. 同样需要自定义一个JsonConverter类 ,同刚才的步骤.
  2. 在实体类上,增加注解,只向这个转换器
 public class FsiResponse
    {
        [JsonConverter(typeof(IntJsonConverter))]
        public string? infcode { get; set; }
  1. 然后反序列化的时候, 按照默认的写法即可

    fsiResponse = JsonSerializer.Deserialize<FsiResponse>(contentStream);
    
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何浩翔

如果对你多帮助,请支持。感谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值