System.Text.Json类库进行json转化时 ValueKind:Object 问题

文章目录

  • 写在前面
  • 问题描述
  • 解决办法
  • 扩展 Datetime类型转换源码
  • 完整的配置

写在前面

以下方法中的所有转换器都属于刚刚能解决我的问题状态,实际使用过程中应该编写更加严谨的逻辑。

问题描述

webapi 当使用System.Text.Json类库进行json转化时,如果没有明确类型的基础类型,则会出现转换值为ValueKind:Object {xxxxx}等问题。

解决办法

通过自定义转换器实现

代码如下:

public class ObjectJsonConverter : JsonConverter<Object>
{public override object? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options){if (reader.TokenType == JsonTokenType.String){if (DateTime.TryParse(reader.GetString(), out DateTime dateTime))return dateTime;return reader.GetString();}else if (reader.TokenType == JsonTokenType.Number){if (reader.TryGetInt32(out int intNum))return intNum;else if (reader.TryGetDouble(out double doubleNum))return doubleNum;elsereturn reader.GetDecimal();}return reader.GetDecimal();}public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options){ Type objType = value.GetType();if (value == null)writer.WriteNullValue();if (objType == typeof(string) || objType == typeof(DateTime) || objType == typeof(Guid))writer.WriteStringValue(value.ToString());else if (objType == typeof(int))writer.WriteNumberValue((int)value);else if (objType == typeof(double))writer.WriteNumberValue((double)value);else if (objType == typeof(decimal))writer.WriteNumberValue((decimal)value);else if (objType == typeof(char))writer.WriteNumberValue((char)value);else if (objType == typeof(bool))writer.WriteBooleanValue((bool)value);elsewriter.WriteStringValue(value.ToString()); }
}

在入口程序配置

// 添加Object格式化转换器
options.JsonSerializerOptions.Converters.Add(new ObjectJsonConverter());

扩展 Datetime类型转换源码

public class DateTimeJsonConverter : JsonConverter<DateTime>
{public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options){if (reader.TokenType == JsonTokenType.String){if (DateTime.TryParse(reader.GetString(), out DateTime dateTime)){return dateTime;}}return reader.GetDateTime();}public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options){writer.WriteStringValue(value.ToString("yyyy年MM月dd日 HH时mm分ss秒"));}
}

完整的配置

// Add services to the container. 
builder.Services.AddControllers().AddJsonOptions(options =>
{// 设置编码格式options.JsonSerializerOptions.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping;// 是否格式化文本options.JsonSerializerOptions.WriteIndented = true; // 字段采用驼峰式命名options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;// 忽略null值options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;// 忽略只读字段options.JsonSerializerOptions.IgnoreReadOnlyProperties = true;// 允许属性值末尾存在逗号options.JsonSerializerOptions.AllowTrailingCommas = true;// 处理循环引用类型options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
//枚举类型转string配置(避免转int)options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());// 添加时间格式化转换器options.JsonSerializerOptions.Converters.Add(new DateTimeJsonConverter());// 添加Object格式化转换器options.JsonSerializerOptions.Converters.Add(new ObjectJsonConverter());});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/235940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 2828. 判别首字母缩略词

【LetMeFly】2828.判别首字母缩略词 力扣题目链接&#xff1a;https://leetcode.cn/problems/check-if-a-string-is-an-acronym-of-words/ 给你一个字符串数组 words 和一个字符串 s &#xff0c;请你判断 s 是不是 words 的 首字母缩略词 。 如果可以按顺序串联 words 中每…

MTK平台 BT从SW 如何分析 Pairing Fail 和 Abnormal Disconnection Issue

一 概要 本文旨在介绍当配对/回连失败(Pairing Fail) 以及 异常断线(Abnormal Disconnection) 类问题发生时,需要取得哪些必要的log、如何获取这些log,以及怎样对log进行简单的分析解读,协助定位问题点,过滤掉一些常见的因测试操作步骤、IOT device、测试环境等导致的误…

TCP 核心工作机制

TCP 的核心知识&#xff1a;如何保证传输可靠 如何提高传输效率 如何保证传输可靠&#xff1a;确认应答机制 超时重传机制 如何提高传输效率&#xff1a;滑动窗口机制、流量控制机制、延时应答机制、捎带确认机制、拥塞控制机制 可靠机制 TCP的可靠性主要是通过 确认应答 …

【轻量化篇】YOLOv8改进实战 | 更换主干网络 Backbone 之 RepGhostnet,重参数化实现硬件高效的Ghost模块

YOLOv8专栏导航:点击此处跳转 前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操…

[学习笔记]SQL Server中批量查找所有符合Where条件的记录

目标&#xff1a;在SQL Server中查找所有表的UserId 50的记录 创建一个表变量来存储所有包含’UserId’列的表的名称。然后使用一个游标遍历这些表&#xff0c;并对每个表执行一个动态SQL查询 DECLARE TableName nvarchar(256), ColumnName nvarchar(128), SearchStr2 nvarc…

CentOS 宣布停更3年后,服务器操作系统何去何从?

“CentOS 要停止更新了&#xff1f;” 盯着电脑&#xff0c;某大型企业数字化部门的负责人彭素素看到这个消息&#xff0c;不仅在心里发出了一声惊呼。 2020年&#xff0c;CentOS 停止更新的消息&#xff0c;不仅彭素素所在的企业&#xff0c;对于不少正在使用 CentOS 的厂商…

app设置为HomeLauncher后,如果进行adb install安装,界面会黑屏问题排查记录

一、开始以为是PMS的问题,但是读完PackageManagerService.java的安装流程后发现并不是这么回事。 其中比较重要的是freezePackageForInstall函数,app在替换原来的内容之前,会先冻住正在运行的app,然后发送kill命令到ActivityManagerService,在AMS中才会去kill掉app。而且…

Python多个列表连接实例代码解析

概要 在Python中&#xff0c;连接多个列表是一种常见的操作&#xff0c;用于将多个列表合并为一个。这个过程可以应用于各种数据处理和编程任务中。本文将介绍多种连接多个列表的方法&#xff0c;并提供详细的示例代码来帮助大家更好地理解。 使用 运算符 最简单的方法是使用…

【RTOS学习】源码分析(信号量和互斥量 事件组 任务通知)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f353;信号量和互斥量&#x1f345;创建&#x1f345;Take&#x1f345;Give &#x…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -SpringMVC搭建框架

第一章 初识SpringMVC 1.1 SpringMVC概述 SpringMVC是Spring子框架 SpringMVC是Spring 为**【展现层|表示层|表述层|控制层】**提供的基于 MVC 设计理念的优秀的 Web 框架&#xff0c;是目前最主流的MVC 框架。 SpringMVC是非侵入式&#xff1a;可以使用注解让普通java对象&…

Windows: office: MS word: 吐槽:怎么分割一个word文档

最近打开3GPP24-229 这个文档&#xff0c;非常的慢。这个文档文件17M&#xff0c;有一千多页。想着看能不能分割一下分成几个小文件。 从网上找了很长时间&#xff0c;也没找到一个简单明了的合适方法。 其实这种需求非常的普通&#xff0c;但是看着微软没有意愿做这么个简单的…

JS模块化规范之CMD

JS模块化规范之CMD 模块化规范CMD&#xff08;Common Module Definition&#xff09;概念基本语法CMD实现 模块化规范 CMD&#xff08;Common Module Definition&#xff09; 概念 CommonJS module definition CMD规范专门用于浏览器端&#xff0c;模块的加载时异步的&#x…

Pytest fixture 的四种作用域:session、module、class 和 function

当使用 Pytest 测试框架时&#xff0c;fixture 可以具有不同的作用域&#xff0c;以控制其生命周期和共享范围。Pytest 支持四种不同的 fixture 作用域&#xff1a;session、module、class 和 function。 session 作用域(Session Scope)&#xff1a; session 作用域是最宽泛的作…

简单的几个基础卷积操作

当构建卷积神经网络时&#xff0c;我们可以使用不同的卷积操作来提取图像特征。以下是一些常见的卷积操作&#xff0c;以及它们的 PyTorch 实现&#xff1a; 标准卷积层&#xff1a;通过 nn.Conv2d 实现标准的卷积操作。 conv_standard nn.Conv2d(in_channels3, out_channel…

应用 Strangler 模式将遗留系统分解为微服务

许多来源在一般情况下提供了微服务的解释&#xff0c;但缺乏特定领域的示例。新来者或不确定从哪里开始的人可能会发现掌握如何将遗留系统过渡到微服务架构具有挑战性。本指南主要面向那些正在努力启动迁移工作的个人&#xff0c;它提供了特定于业务的示例来帮助理解该过程。 …

磁盘类型选择对阿里云RDS MySQL的性能影响

测试说明 这是一个云数据库性能测试系列&#xff0c;旨在通过简单标准的性能测试&#xff0c;帮助开发者、企业了解云数据库的性能&#xff0c;以选择适合的规格与类型。这个系列还包括&#xff1a; * 云数据库(RDS MySQL)性能深度测评与对比 * 阿里云RDS标准版(x86) vs 经济…

【华为OD题库-103】BOSS的收入-java

题目 一个XX产品行销总公司&#xff0c;只有一个 boss&#xff0c;其有若干一级分销&#xff0c;一级分销又有若干二级分销&#xff0c;每个分销只有唯一的上级分销。规定每个月&#xff0c;下级分销需要将自己的总收入(自己的下级上交的)每满100元上交15元给自己的上级.现给出…

深度学习的推理部分

深度学习的推理部分指的是已经训练好的深度学习模型应用于新数据&#xff08;通常是测试或实际应用数据&#xff09;以进行预测、分类、分割等任务的过程。在深度学习中&#xff0c;训练和推理是两个阶段&#xff1a; 训练阶段&#xff1a; 在这个阶段&#xff0c;深度学习模型…

xcode上传app store connect后testflight没有可构建版本的原因

查看你的邮箱, 里面有原因提示 一般为使用了某些权限, 但是plist没有声明 xcode 修改display name后名字并没有改变 原因是并没有修改到plist的CFBundleDisplayName的字段 将CFBundleDisplayName的值修改为${INFOPLIST_KEY_CFBundleDisplayName} INFOPLIST_KEY_CFBundleDispla…

C++ 模拟实现string

目录 一.类的声明 二.确定成员变量 三.成员函数 1.带参的构造函数&#xff0c;析构函数&#xff0c;拷贝构造 2.size()与capacity() 3.运算符重载 重载数组下标访问[] 重载 重载比较运算符&#xff08;<&#xff0c; < &#xff0c; > &#xff0c; > …