惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Project Zero
Project Zero
Security Archives - TechRepublic
Security Archives - TechRepublic
C
Cyber Attacks, Cyber Crime and Cyber Security
Security Latest
Security Latest
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
Vulnerabilities – Threatpost
C
CERT Recently Published Vulnerability Notes
S
Schneier on Security
G
GRAHAM CLULEY
L
Lohrmann on Cybersecurity
D
Darknet – Hacking Tools, Hacker News & Cyber Security
I
Intezer
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
F
Full Disclosure
T
The Exploit Database - CXSecurity.com
P
Proofpoint News Feed
WordPress大学
WordPress大学
Microsoft Azure Blog
Microsoft Azure Blog
H
Help Net Security
大猫的无限游戏
大猫的无限游戏
MyScale Blog
MyScale Blog
Hacker News: Ask HN
Hacker News: Ask HN
G
Google Developers Blog
H
Heimdal Security Blog
O
OpenAI News
Hugging Face - Blog
Hugging Face - Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
L
LangChain Blog
C
Cisco Blogs
云风的 BLOG
云风的 BLOG
IT之家
IT之家
Cyberwarzone
Cyberwarzone
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Know Your Adversary
Know Your Adversary
博客园 - 聂微东
The Cloudflare Blog
C
Check Point Blog
K
Kaspersky official blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
月光博客
月光博客
T
Tor Project blog
T
Threat Research - Cisco Blogs
T
Tailwind CSS Blog
P
Proofpoint News Feed
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
A
About on SuperTechFans
小众软件
小众软件
Cloudbric
Cloudbric
A
Arctic Wolf

博客园 - Hey,Coder!

Elasticsearch ILM 与 Data Stream 概念及实例说明文档 portainer httphelper封装 Ocelot + Consul + SignalR 粘性会话 正交软件架构 docker postgresql17 主从复制 rabbitmq总结与c#示例 docker rabbitmq quartz dashboard docker consul registrator 服务自动注册consul 微服务动态扩容 ubuntu24.04 安装docker RAG 检索增强生成 软考 - 架构设计师 知识点总结 c# MailKit3.4.3 发送邮件、附件 nginx 反向代理postgresql c# 信号量 elsa 3.5 中间件记录最后执行的节点数据 xp密钥 docker配置代理 openclaw 接入 LMStudio的模型服务 wpf canvas 移动 缩放 windows平台openclaw搭建 wpf scrollerview触摸滚动 c# 动态切换sqlsugar连接字符串 c# Elastic.Clients.Elasticsearch 动态查询 c# es 封装Elastic.Clients.Elasticsearch c# scrollerview滚动到指定元素位置 WPF 重写Expander 基于elsa工作流封装一套变量、组件的体系 常用活动重写 DynamicExpresso 轻量级动态表达式库 c# elsa 3.5.2 程序化工作流常用功能及自定义中间件 leaflet docker 连接老版本的sqlserver ssl错误 c# quartz 动态创建任务 控制任务运行和停止 依赖注入 cefsharp 模拟点击 批量重置数据库的数据 docker 复制远程镜像本地并创建容器 c# newtonsoft dynamic
c# System.Text.Json 反序列化Dictionary<string,object>时未转换基础类型的处理方法
Hey,Coder! · 2026-04-07 · via 博客园 - Hey,Coder!
public class ObjectToInferredTypesConverter
       : JsonConverter<object>
        {
            public override object Read(
                ref Utf8JsonReader reader,
                Type typeToConvert,
                JsonSerializerOptions options)
            {
                if (reader.TokenType == JsonTokenType.True)
                {
                    return true;
                }

                if (reader.TokenType == JsonTokenType.False)
                {
                    return false;
                }

                if (reader.TokenType == JsonTokenType.Number)
                {
                    if (reader.TryGetInt64(out long l))
                    {
                        return l;
                    }

                    return reader.GetDouble();
                }

                if (reader.TokenType == JsonTokenType.String)
                {
                    if (reader.TryGetDateTime(out DateTime datetime))
                    {
                        return datetime;
                    }

                    return reader.GetString();
                }

                // Use JsonElement as fallback.
                // Newtonsoft uses JArray or JObject.
                using JsonDocument document = JsonDocument.ParseValue(ref reader);
                return document.RootElement.Clone();
            }

                public override void Write(
Utf8JsonWriter writer,
object objectToWrite,
JsonSerializerOptions options)
    {
        if (objectToWrite == null)
        {
            writer.WriteNullValue();
            return;
        }

        var type = objectToWrite.GetType();

        // 处理基本类型
        switch (Type.GetTypeCode(type))
        {
            case TypeCode.Boolean:
                writer.WriteBooleanValue((bool)objectToWrite);
                return;
            case TypeCode.Byte:
                writer.WriteNumberValue((byte)objectToWrite);
                return;
            case TypeCode.SByte:
                writer.WriteNumberValue((sbyte)objectToWrite);
                return;
            case TypeCode.Int16:
                writer.WriteNumberValue((short)objectToWrite);
                return;
            case TypeCode.UInt16:
                writer.WriteNumberValue((ushort)objectToWrite);
                return;
            case TypeCode.Int32:
                writer.WriteNumberValue((int)objectToWrite);
                return;
            case TypeCode.UInt32:
                writer.WriteNumberValue((uint)objectToWrite);
                return;
            case TypeCode.Int64:
                writer.WriteNumberValue((long)objectToWrite);
                return;
            case TypeCode.UInt64:
                writer.WriteNumberValue((ulong)objectToWrite);
                return;
            case TypeCode.Single:
                writer.WriteNumberValue((float)objectToWrite);
                return;
            case TypeCode.Double:
                writer.WriteNumberValue((double)objectToWrite);
                return;
            case TypeCode.Decimal:
                writer.WriteNumberValue((decimal)objectToWrite);
                return;
            case TypeCode.String:
                writer.WriteStringValue((string)objectToWrite);
                return;
            case TypeCode.Char:
                writer.WriteStringValue(objectToWrite.ToString());
                return;
            case TypeCode.DateTime:
                writer.WriteStringValue((DateTime)objectToWrite);
                return;
        }

        // 处理 JsonElement(这是 Read 方法中可能返回的类型)
        if (objectToWrite is JsonElement jsonElement)
        {
            jsonElement.WriteTo(writer);
            return;
        }

        // 处理其他类型
        if (type == typeof(Guid) || type == typeof(Guid?))
        {
            writer.WriteStringValue(objectToWrite.ToString());
            return;
        }

        if (type == typeof(DateTimeOffset) || type == typeof(DateTimeOffset?))
        {
            writer.WriteStringValue((DateTimeOffset)objectToWrite);
            return;
        }

        if (type == typeof(TimeSpan) || type == typeof(TimeSpan?))
        {
            writer.WriteStringValue(objectToWrite.ToString());
            return;
        }

        // 处理数组
        if (type.IsArray)
        {
            writer.WriteStartArray();
            var array = (Array)objectToWrite;
            foreach (var item in array)
            {
                Write(writer, item, options);
            }
            writer.WriteEndArray();
            return;
        }

        // 处理 IEnumerable 类型
        if (objectToWrite is System.Collections.IEnumerable enumerable)
        {
            writer.WriteStartArray();
            foreach (var item in enumerable)
            {
                Write(writer, item, options);
            }
            writer.WriteEndArray();
            return;
        }

        // 对于复杂对象,使用默认的序列化方式
        // 注意:为了避免递归调用当前转换器,我们需要创建一个新的选项
        var newOptions = new JsonSerializerOptions(options);
        newOptions.Converters.Remove(this);

        JsonSerializer.Serialize(writer, objectToWrite, newOptions);
    }
        }



//注入配置、或在反序列化时指定转换器
//1. 全局配置
 builder.AddJsonOptions(options =>
 {
     options.JsonSerializerOptions.Converters.Add(new ObjectToInferredTypesConverter());

 });

//2. 反序列化时指定转换器
  var options = new JsonSerializerOptions
  {
      Converters = { new ObjectToInferredTypesConverter() }
  };
  var parseData = JsonSerializer.Deserialize<Dictionary<string, object>(jsonString, options);

公共方法封装

public static class JsonUtil
{
    public static T GetJsonObj<T>(object obj)
    {
        var jsonString = System.Text.Json.JsonSerializer.Serialize(obj);

        // 解析所有的字段
        var options = new JsonSerializerOptions
        {
            Converters = { new ObjectToInferredTypesConverter() }
        };
        var parseData = JsonSerializer.Deserialize<T>(jsonString, options);

        return parseData;
    }
}

[参考]
netcore 底层序列化Dictionary<string,object> 对象的一个Bug 以及解决方案