当前位置: 首页 > news >正文

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

当你的使用的Json库是System.Text.Json,而不是Newtonsoft.Json库的时候,你可能遇到以下问题及其解决办法。通常的解决办法是进行一些对应的配置。此外就需要根据情况使用自定义转换器实现你的需求。以下是通常遇到的使用自定义转换器解决的例子:

Q1.当遇到System.InvalidCastException:“Unable to cast object of type ‘System.Text.Json.JsonElement’ to type ‘System.Int32’.”这种错误的时候,是由于System.Text.Json类库进行json转化时,没有明确类型的基础类型导致的。通常可能是某一个属性类型使用object情况。

A1:解决办法是写一个 对象Json转换器 类,如下所示:

  /// <summary>/// 对象Json转化器/// </summary>public class ObjectJsonConverter : JsonConverter<Object>{public override object? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options){switch (reader.TokenType){case JsonTokenType.String:if (DateTime.TryParse(reader.GetString(), out DateTime dateTime))return dateTime;return reader.GetString();case JsonTokenType.Number:if (reader.TryGetInt32(out int intValue))return intValue;else if (reader.TryGetDouble(out double doubleValue))return doubleValue;else if (reader.TryGetDecimal(out decimal decimalValue))return decimalValue;throw new JsonException("Unsupported number format");case JsonTokenType.True:return true;case JsonTokenType.False:return false;case JsonTokenType.Null:return null;case JsonTokenType.StartObject:return JsonSerializer.Deserialize<JsonElement>(ref reader, options);case JsonTokenType.StartArray:return JsonSerializer.Deserialize<JsonElement[]>(ref reader, options);default:throw new JsonException($"Unexpected token type: {reader.TokenType}");}}public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options){if (value == null) writer.WriteNullValue();else if ((value is string || value is DateTime || value is Guid)) writer.WriteStringValue(value.ToString());else if (value is int intValue) writer.WriteNumberValue(intValue);else if (value is double doubleValue) writer.WriteNumberValue(doubleValue);else if (value is decimal decimalValue) writer.WriteNumberValue(decimalValue);else if (value is char charValue) writer.WriteNumberValue(charValue);else if (value is bool boolValue) writer.WriteBooleanValue(boolValue);else if (value is JsonElement jsonElement) jsonElement.WriteTo(writer);else if (value is JsonElement[] jsonElements){writer.WriteStartArray();foreach (var element in jsonElements){element.WriteTo(writer);}writer.WriteEndArray();}else JsonSerializer.Serialize(writer, value, value.GetType(), options);}}

使用如下:

builder.Services.AddJsonOptions(options =>
{// 添加Object格式化转换器options.JsonSerializerOptions.Converters.Add(new ObjectJsonConverter());
});

Q2:在webapi接口返回结果中,时间属性的值返回的形式如:“2024-01-01T10:00:00”,而我们想要的是不带T的格式,比如"2024-01-01 10:00:00"这种。

A2:需要定义一个时间Json转换器DateTimeJsonConverter,代码如下:

 /// <summary>/// 设置Json默认DateTime格式化/// </summary>public class DateTimeJsonConverter : JsonConverter<DateTime>{private readonly string _format;public DateTimeJsonConverter(string format){_format = format;}public override void Write(Utf8JsonWriter writer, DateTime dateTime, JsonSerializerOptions options){writer.WriteStringValue(dateTime.ToString(_format));}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();}}

使用如下:

builder.Services.AddJsonOptions(options =>
{// 添加时间格式化转换器options.JsonSerializerOptions.Converters.Add(new DateTimeJsonConverter("yyyy-MM-dd HH:mm:ss"));
});

通常完整一点的配置如下:

builder.Services.AddJsonOptions(options =>
{// 设置编码格式
options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
// 是否格式化文本
options.JsonSerializerOptions.WriteIndented = true;
//不区分大小写
options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;//不区分大小写
// 字段采用驼峰式命名
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
// 忽略null值
//options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
// 忽略只读字段
//options.JsonSerializerOptions.IgnoreReadOnlyProperties = true;
// 对字典的键进行驼峰命名
options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
//不允许有注释的不标准json
options.JsonSerializerOptions.ReadCommentHandling = JsonCommentHandling.Disallow;
// 允许属性值末尾存在逗号
options.JsonSerializerOptions.AllowTrailingCommas = true;
// 处理循环引用类型
options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
//枚举类型转string配置(避免转int)
//options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
// 添加时间格式化转换器
options.JsonSerializerOptions.Converters.Add(new DateTimeJsonConverter("yyyy-MM-dd HH:mm:ss"));
// 添加Object格式化转换器
options.JsonSerializerOptions.Converters.Add(new ObjectJsonConverter());
});

Q3:遇到枚举的属性,如果想在接口返回的时候不返回数字,而想返回字符串的情况

A3:在配置的时候进行如下配置即可:

builder.Services.AddJsonOptions(options =>
{//枚举类型转string配置(避免转int)options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});

此外在枚举的地方添加[JsonConverter(typeof(JsonStringEnumConverter))]特性即可返回字符串,代码如下:

 public class Sample{public int Id { get; set; }public object  Value { get; set; }[JsonConverter(typeof(JsonStringEnumConverter))]public SampleType Type { get; set; }}public enum SampleType{AAAA,BBBB,CCCC}

如果有不够的地方,自行添加。

相关文章:

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

当你的使用的Json库是System.Text.Json&#xff0c;而不是Newtonsoft.Json库的时候&#xff0c;你可能遇到以下问题及其解决办法。通常的解决办法是进行一些对应的配置。此外就需要根据情况使用自定义转换器实现你的需求。以下是通常遇到的使用自定义转换器解决的例子: Q1.当遇…...

免费Excel工作表同类数据合并工具

下载地址&#xff1a;https://pan.quark.cn/s/81b1aeb45e4c 在 Excel 表格里&#xff0c;当我们试图手动将多行同类数据合并为一行时&#xff0c;会遭遇诸多棘手的困难以及繁杂的操作流程。在确定哪些数据属于可合并的同类数据时&#xff0c;单纯依靠人工进行对比&#xff0c;极…...

如何在算家云搭建Video-Infinity(视频生成)

一、模型介绍 Video-Infinity是一个先进的视频生成模型&#xff0c;使用多个 GPU 快速生成长视频&#xff0c;无需额外训练。它能够基于用户提供的文本或图片提示&#xff0c;创造出高质量、多样化的视频内容。 二、模型搭建流程 1.大模型 Video-Infinity 一键使用 基础环境…...

LeetCode搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2 …...

UE5学习笔记24-添加武器弹药

一、给角色的武器添加弹药 1.创建界面&#xff0c;根据笔记23的界面中添加 2.绑定界面控件 UPROPERTY(meta (Bindwidget))UTextBlock* WeaponAmmoAmount;UPROPERTY(meta (Bindwidget))UTextBlock* CarriedAmmoAmount; 3.添加武器类型枚举 3.1创建武器类型枚举头文件 3.2创建文…...

限制游客在wordpress某分类下阅读文章的数量

在WordPress中实现某个分类下的内容限制游客只能阅读前5篇文章&#xff0c;注册用户可以阅读更多文章的功能&#xff0c;可以通过以下步骤来完成&#xff1a; 1. 安装和激活插件 首先&#xff0c;你可以使用一个插件来简化这个过程。一个常用的插件是 “MemberPress” 或 “R…...

Oracle云主机申请和使用教程:从注册到SSH连接的全过程

今天我要和大家分享如何成功申请Oracle云主机,并进行基本的配置和使用。我知道很多同行的朋友在申请Oracle云主机时都遇到了困难&#xff08;疑惑abc错误&#xff09;,可能试了很多次都没有成功。现总结一下这些年来的一些注册流程经验&#xff0c;或许你们也能成功申请到自己的…...

芯知识 | NVH-FLASH语音芯片支持平台做语音—打造音频IC技术革新

随着科技的飞速发展&#xff0c;人们对于电子产品的音频性能要求越来越高。在这种背景下&#xff0c;NVH-FLASH系列语音芯片应运而生&#xff0c;作为音频IC领域的一次重大技术革新&#xff0c;NVH-FLASH系列语音芯片凭借其卓越的性能与灵活的支持平台&#xff0c;正逐步引领着…...

机器学习——解释性AI与可解释性机器学习

解释性AI与可解释性机器学习: 理解机器学习模型背后的逻辑 随着人工智能技术的广泛应用&#xff0c;机器学习模型越来越多地被用于决策过程。然而&#xff0c;这些模型&#xff0c;尤其是深度学习模型&#xff0c;通常被视为“黑箱”&#xff0c;难以理解其背后的决策逻辑。解…...

中国全国省市区县汇总全国省市区json省市区数据2024最新

简介 包含全国省市区县数据,共3465个。 全国总共有23个省、5个自治区、4个直辖市、2个特别行政区。 ——更新于2024年10月16日,从2017年开始,已经更新坚持7年 从刚开始1000个左右的城市json,到现在全国省市区县3465个。 本人感觉应该是目前最完善的~ 每年都在更新中,…...

[Linux#67][IP] 报头详解 | 网络划分 | CIDR无类别 | DHCP动态分配 | NAT转发 | 路由器

目录 一. IP协议头格式 学习任何协议前的两个关键问题 IP 报头与有效载荷分离 分离方法 为什么需要16位总长度 如何交付 二. 网络通信 1.IP地址的划分理念 2. 子网管理 3.网络划分 CIDR&#xff08;无类别域间路由&#xff09; 目的IP & 当前路由器的子网掩码 …...

路由器原理和静态路由配置

一、路由器的工作原理 根据路由表转发数据 接收数据包→查看目的地址→与路由表进行匹配找到转发端口→转发到该端口 二、路由表的形成 它是路由器中维护的路由条目的集合&#xff0c;路由器根据路由表做路径选择&#xff0c;里面记录了网段ip地址和对应下一跳接口的接口号。…...

UE5 使用Animation Budget Allocator优化角色动画性能

Animation Budget Allocator是UE内置插件&#xff0c;通过锁定动画系统所占CPU的预算&#xff0c;在到达预算计算量时对动画进行限制与优化。 开启Animation Budget Allocator需要让蒙皮Mesh使用特定的组件&#xff0c;并进行一些编辑器设置即可开启。 1.开启Animation Budget…...

Element UI 组件库详解:从入门到精通

在追求统一且流畅的用户体验时&#xff0c;开发者们常常选择使用 UI 组件库来加快开发速度。Element UI&#xff0c;这个基于 Vue.js 的组件库&#xff0c;提供了大量界面组件&#xff0c;极大地提升了前端开发的效率。本文将指导您如何开始使用 Element UI 组件库&#xff0c;…...

JavaScript 事件循环(EventLoop) —— 浏览器 Node

一、事件循环的本质 本质&#xff1a;运行时对 JS 脚本的调度方式就叫做事件循环. 对于 浏览器 而言&#xff0c;需要考虑用户交互、UI渲染、脚本运行、网络请求等操作&#xff0c;这些操作必然都依赖于事件去执行&#xff0c;因此&#xff0c;为了协调事件必须要使用事件循环…...

【ROS2】订阅手柄数据,发布运动命令

1、相关消息 sensor_msgs::msg::Joy:用来描述手柄控制器数据 geometry_msgs::msg::Twist :用来描述物体运动时的线速度和角速度 参见博客: 【ROS2】geometry_msgs::msg::Twist和sensor_msgs::msg::Joy 2、订阅和发布 2.1 定义、创建订阅者和发布者 订阅手柄的按键、摇杆…...

WinX86内核02-驱动程序

把昨天的程序改用 c++ 编译,改成 .cpp ,发现编译报错 原因是名称粉碎,因此可以直接 extern “C”声明一下这个函数 或者用 头文件(推荐) 因为 在头文件中 可以把 头文件一起包含进去 #pragma once extern "C" { #include <Ntddk.h> ​ /*驱动入口函…...

基于SpringBoot+Vue的体育馆场地预约系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

【WebGIS】Cesium:天地图加载

天地图是中国国家基础地理信息系统&#xff0c;由中国测绘地理信息局和国家地理信息公共服务平台共同开发和运营。它提供多项地理信息服务&#xff0c;包括地图数据、地理编码、路径规划以及地理搜索等。天地图的目标是为各行业提供高质量、全面的地理信息数据和解决方案。 天…...

[产品管理-46]:产品组合管理中的项目平衡与管道平衡的区别

目录 一、项目平衡 1.1 概述 1.2 项目的类型 1、根据创新程度和开发方式分类 2、根据产品开发和市场周期分类 3、根据风险程度分类 4、根据市场特征分类 5、根据产品生命周期分类 1.3 产品类型的其他分类 1、按物理形态分类 2、按功能或用途分类 3、按技术或创新程…...

反激变换器磁学分析

一、反激变换器变压器功能及其占空比图1如图1所示&#xff0c;为反激变换器拓扑&#xff0c;变压器一次绕组匝数和变压器二次绕组匝数之比为&#xff1b;反激变换器变压器功能&#xff1a;由图1中正负号所示&#xff0c;一次绕组和二次绕组的感应电压方向相反&#xff0c;当开关…...

PMP培训机构对比:才聚凭什么比同行更值得选?

选择PMP培训机构&#xff0c;很多人在“才聚vs其他”之间反复比较。本文从机构资质、考试服务、教学实力、学员平台四个维度展开对比&#xff0c;帮你一次看清差距。 一、国内最早一批PMP培训机构&#xff0c;历史积淀不同 市面上不少PMP培训机构成立于2010年以后&#xff0c;行…...

微信QQ防撤回终极方案:3分钟搞定消息永久保存

微信QQ防撤回终极方案&#xff1a;3分钟搞定消息永久保存 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitcode.com/GitHub…...

嵌入式Linux学习(Day05)C 语言(第二天)核心语法:运算符与流程控制(超详细笔记)

本文整理 C 语言运算符和流程控制语句核心知识点&#xff0c;结合表格梳理语法规则、搭配代码示例 实战练习&#xff0c;零基础友好&#xff0c;适合入门巩固、刷题备考&#xff0c;可直接用于 C 语言基础学习参考。一、运算符补充C 语言运算符是编程基础&#xff0c;本节重点…...

超离谱!iOS 26.0.1 Filza 管理器发布,有效可用

Filza 内置 DarkSword 利用已发布&#xff0c;支持更多系统版本。 注意&#xff01;System 目录仍然无法修改&#xff0c;仅对 var/mobile 目录。能实现读取、写入、删除等操作。有点离谱&#xff01;Little_34306 作者刚发布网页版授权 Filza 方法&#xff0c;现在又发布 Fi…...

G-Helper终极解决方案:华硕笔记本风扇与性能问题完全指南

G-Helper终极解决方案&#xff1a;华硕笔记本风扇与性能问题完全指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix,…...

告别繁琐下载:一键获取国家中小学智慧教育平台电子教材的智能解决方案

告别繁琐下载&#xff1a;一键获取国家中小学智慧教育平台电子教材的智能解决方案 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具&#xff0c;帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载&#xff0c;让您更方便地获取课本内…...

如何快速上手openpilot:新手必看的5大实用技巧指南

如何快速上手openpilot&#xff1a;新手必看的5大实用技巧指南 【免费下载链接】openpilot openpilot is an operating system for robotics. Currently, it upgrades the driver assistance system on 300 supported cars. 项目地址: https://gitcode.com/GitHub_Trending/o…...

网络设备唯一身份证:MAC地址原理与作用全网最详解析

网络设备唯一身份证&#xff1a;MAC地址原理与作用全网最详解析 前言一、MAC地址&#xff1a;核心定义1.1 标准定义1.2 通俗理解1.3 核心特性 二、MAC地址&#xff1a;表示格式2.1 标准格式2.2 组成结构&#xff08;两大部分&#xff09;2.3 结构流程图 三、MAC地址&#xff1a…...

【实战】豆包API批量图生图:从脚本到系统的效率跃迁

1. 从脚本到系统的进化之路 记得去年接手一个电商项目时&#xff0c;我需要为2000多款商品生成场景图。最初用简单的Python脚本调用豆包API&#xff0c;结果半夜被报警电话吵醒——脚本卡死了&#xff0c;只完成了不到三分之一的任务。这次惨痛教训让我意识到&#xff0c;批量图…...