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

导读:这篇文章主要介绍了.Net自定义转换器JsonConverter的使用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 目录 场景描述

这篇文章主要介绍了.Net 自定义转换器JsonConverter的使用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

目录
  • 场景描述

  • 通过JsonSerializerOptions参数,绑定JsonConverter来实现

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

参考官方文档

 

场景描述

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

1
2
3
4
5
6
7
8
9
10
11
12
有时候返回时这个
{
    "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方法.

  • 下面是关键部分代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

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

5.这样就可以了

 

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

  • 同样需要自定义一个JsonConverter类 ,同刚才的步骤.

  • 在实体类上,增加注解,只向这个转换器

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

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

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

到此这篇关于.Net 自定义转换器JsonConverter的使用详解的文章就介绍到这了。

你也想免费领取小码王编程资料吗?
填写信息免费领取
免责申明:以上展示内容来源于合作媒体、企业机构、网友提供或网络收集整理,版权争议与本站无关,文章涉及见解与观点不代表小码王官方立场,请读者仅做参考。本文标题:.Net 自定义转换器JsonConverter的使用详解,本文链接:https://www.xiaomawang.cn/help/200529.html;欢迎转载,转载请说明出处。若您认为本文侵犯了您的版权信息,或您发现该内容有任何涉及有违公德、触犯法律等违法信息,请您立即通过邮件(邮箱号:)联系我们及时修正或删除。
校区接待前厅
校区太空走廊
校区教室环境
校区多功能教室
小码王少儿编程体验课程免费预约