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

目录
  • 场景描述
  • 通过JsonSerializerOptions参数,绑定JsonConverter来实现
  • 在实体类的属性上 增加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来实现

  • 这里新建一个类,例如取名为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)

相关推荐

  • ASP.NET2.0服务器控件之类型转换器

    类型转换器是实现自定义服务器控件属性过程中比较重要的内容.本文将对类型转换器的基本概念和实现方法进行介绍. 1. 类型转换器基本概念 类型转换器是自定义服务器控件的辅助性功能实现.它主要用于执行从字符串表示形式到指定类型之间的双向转换.例如,以文本形式表示属性值,将用户输入的文本转换为相应数据类型等等,都应用了类型转换器. 对于多数基本数据类型(如Int32.Bool.Char.String.枚举类型等),.net框架已经为它们提供了默认的类型转换器,这些类型转换器完成从字符串到相关值的转换并执

  • 使用JsonConverter处理上传文件的路径问题

    目录 场景 解决方法 使用 场景 我们上传一个文件,把文件保存到服务器上,会有一个明确的物理路径,由于需要从前端访问这个文件,还需要web服务器中的一个虚拟路径.这个虚拟路径的存储会有一个问题,我们应该在数据库里存什么?是带域名的全路径,还是相对于web根目录的相对路径? 现在很多架构都是前后分离的,所以前端访问的url是全路径比较好,不像之前前后都是一个项目中,数据库存相对路径,前端也使用相对路径访问没有问题.如果存全路径,域名更换的时候就比较麻烦,需要手动把数据库里的数据替换一下.如果存相对

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

    目录 场景描述 通过JsonSerializerOptions参数,绑定JsonConverter来实现 在实体类的属性上 增加JsonConverter注解来实现 参考官方文档 场景描述 例如api返回了以下json串 (infcode的值有可能时string 也可能时number 有时候返回时这个 { "infcode": -1, "detail_msg": null } 有时后也可能时这个 { "infcode": "-1&quo

  • Spring中自定义数据类型转换的方法详解

    目录 类型转换服务 实现Converter接口 实现ConverterFactory接口 实现GenericConverter接口 环境:Spring5.3.12.RELEASE. Spring 3引入了一个core.onvert包,提供一个通用类型转换系统.系统定义了一个SPI来实现类型转换逻辑,以及一个API来在运行时执行类型转换.在Spring容器中,可以使用这个系统作为PropertyEditor实现的替代,将外部化的bean属性值字符串转换为所需的属性类型.还可以在应用程序中需要类型转

  • Spark自定义累加器的使用实例详解

    累加器(accumulator)是Spark中提供的一种分布式的变量机制,其原理类似于mapreduce,即分布式的改变,然后聚合这些改变.累加器的一个常见用途是在调试时对作业执行过程中的事件进行计数. 累加器简单使用 Spark内置的提供了Long和Double类型的累加器.下面是一个简单的使用示例,在这个例子中我们在过滤掉RDD中奇数的同时进行计数,最后计算剩下整数的和. val sparkConf = new SparkConf().setAppName("Test").setM

  • Android 自定义返回按钮的实例详解

    Android 自定义返回按钮的实例详解 程序中我们有时候想让放回按钮按照自己的需求调整页面而不是单纯的按照系统返回上一级,这个问题很简单,重写 onKeyDown 方法即可. 下面方法,包含了 webview 中的返回上一页和普通 activity 的单击设置和双击退出程序. @Override public boolean onKeyDown(int keyCode, KeyEvent event) { //如果我们用的是webview页面,想返回网页的上一页设置这里就可以了 if (key

  • Android Studio 生成自定义jar包的步骤详解

    想要将一个项目导出为jar包,供其它项目使用,在eclipse中可以直接导出该项目为jar包,而 在AS中可以通过修改gradle才处理. 接下来就介绍下具体的步骤: 1.新建一个项目,项目名随意,eg:MakeJarApplication,在项目中新建一个module类型为android-library ,命名为testLibrary.如图: 项目结构图 2.让app依赖这个库,在app下的build.gradle文件中添加compile project(':testlibrary') dep

  • 对Pycharm创建py文件时自定义头部模板的方法详解

    如下所示: # -*- coding: utf-8 -*- """ ------------------------------------------------- File Name: ${NAME} Description : Author : ${USER} date: ${DATE} ------------------------------------------------- Change Activity: ${DATE}: ----------------

  • Element-ui tree组件自定义节点使用方法代码详解

    工作上使用到element-ui tree 组件,主要功能是要实现节点拖拽和置顶,通过自定义内容方法(render-content)渲染树代码如下~ <template> <div class="sortDiv"> <el-tree :data="sortData" draggable node-key="id" ref="sortTree" default-expand-all :expand-

  • Oracle自定义脱敏函数的代码详解

    对于信息安全有要求的,在数据下发和同步过程中需要对含有用户身份信息的敏感字段脱敏,包括用户姓名.证件号.地址等等,下面是自定义函数的代码 CREATE OR REPLACE FUNCTION F_GET_SENSITIVE(IN_STR VARCHAR, IN_TYPE NUMBER) RETURN VARCHAR2 IS V_STR_LENGTH NUMBER; V_NAME VARCHAR2(1000); V_N NUMBER; V_HID VARCHAR2(200); V_SQL VARC

  • 微信小程序页面调用自定义组件内的事件详解

    这篇文章主要介绍了微信小程序页面调用自定义组件内的事件详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 page page.json { "usingComponents": { "my-component": "../components/component/component", } } page.wxml <my-component id="myComponent&quo

  • 基于Layui自定义模块的使用方法详解

    layui是一个极其不错的前端UI框架.是后端程序员的福音.总之如果你是一个后端开发者.如果你苦于你的界面"惨不忍睹".选择layui来开发是个极好的选择. 之前的项目也有使用过layui.只是没有过多的关注其框架本身.对于项目上.拿来即用即可! 为什么要自定义模块呢?好处很多.比如可以大量重用代码...... 我也是一个极其懒惰的人.总是想办法让代码可重用 根据layui官方的文档说明.首先第一步是要确定你要扩展的模块名称 我现在做的是登录功能.因此我的扩展模块名叫 login 使用

随机推荐