首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用System.Text.Json反序列化为不区分大小写的字典

,可以通过自定义JsonConverter来实现。

首先,我们需要创建一个自定义的JsonConverter类,继承自System.Text.Json.Serialization.JsonConverter<T>,其中T为字典类型。在这个自定义的JsonConverter类中,我们需要重写Read方法和Write方法。

在Read方法中,我们可以通过使用JsonDocument类来解析JSON字符串,并将其转换为字典对象。在转换过程中,我们可以通过设置JsonSerializerOptions的PropertyNameCaseInsensitive属性为true,来实现不区分大小写的属性名匹配。

在Write方法中,我们可以将字典对象转换为JSON字符串。

下面是一个示例的自定义JsonConverter类的代码:

代码语言:txt
复制
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;

public class DictionaryCaseInsensitiveConverter<TValue> : JsonConverter<Dictionary<string, TValue>>
{
    public override Dictionary<string, TValue> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var dictionary = new Dictionary<string, TValue>(StringComparer.OrdinalIgnoreCase);
        var jsonDocument = JsonDocument.ParseValue(ref reader);

        foreach (var property in jsonDocument.RootElement.EnumerateObject())
        {
            var key = property.Name;
            var value = JsonSerializer.Deserialize<TValue>(property.Value.GetRawText(), options);
            dictionary[key] = value;
        }

        return dictionary;
    }

    public override void Write(Utf8JsonWriter writer, Dictionary<string, TValue> value, JsonSerializerOptions options)
    {
        writer.WriteStartObject();

        foreach (var pair in value)
        {
            writer.WritePropertyName(pair.Key);
            JsonSerializer.Serialize(writer, pair.Value, options);
        }

        writer.WriteEndObject();
    }
}

使用这个自定义的JsonConverter类,我们可以在反序列化时实现不区分大小写的字典。下面是一个示例代码:

代码语言:txt
复制
using System;
using System.Collections.Generic;
using System.Text.Json;

public class Program
{
    public static void Main()
    {
        var jsonString = "{\"Key1\": \"Value1\", \"key2\": \"Value2\", \"KEY3\": \"Value3\"}";

        var options = new JsonSerializerOptions();
        options.Converters.Add(new DictionaryCaseInsensitiveConverter<string>());

        var dictionary = JsonSerializer.Deserialize<Dictionary<string, string>>(jsonString, options);

        foreach (var pair in dictionary)
        {
            Console.WriteLine($"{pair.Key}: {pair.Value}");
        }
    }
}

输出结果为:

代码语言:txt
复制
Key1: Value1
key2: Value2
KEY3: Value3

在这个示例中,我们使用了自定义的JsonConverter类来实现不区分大小写的字典反序列化。通过设置JsonSerializerOptions的PropertyNameCaseInsensitive属性为true,我们可以实现不区分大小写的属性名匹配。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

.NETCore3.1中Json互操作最全解读-收藏级

序列化和反序列化 基本知识已经介绍完成,下面我们进入 System.Text.Json 内部世界一探究竟。...这是因为 System.Text.Json 默认采用区分大小写匹配方式,为了解决这个问题,我们需要引入序列化操作个性化设置,请参考下面的代码,启用忽略大小写设置 // 输出 {"name":"Ron...System.Text.Json.Utf8JsonWriter 自定义 JSON 名称和值 在默认情况下,输出JSON属性名称保持和实体对象相同,包括大小写都是一致,枚举类型在默认情况下被序列化为数值类型...在反序列化时候,允许 JSON 文本包含注释 默认情况下,System.Text.JSON 不支持源JSON 文本包含注释,比如下面的代码,当你不使用 ReadCommentHandling = JsonCommentHandling.Skip...有意思是,被特性 JsonExtensionData 标记属性,在序列化为 JSON 时候,他又会将 ExtensionData 字典都序列化为单个 JSON 属性,这里不再演示,留给大家去体验

2.6K21

使用 System.Text.Json 时,如何处理 Dictionary 中 Key 为自定义类型问题

使用 System.Text.Json 进行 JSON 序列化和反序列化操作时,我们会遇到一个问题:如何处理字典 Key 为自定义类型问题。...接下来,我们使用 JsonSerializer.Serialize 方法将字典序列化为 JSON 字符串,并使用 JsonSerializer.Deserialize 方法将 JSON 字符串反序化为字典...Key 属性作为字典 Key,在序列化操作中,将 Key 属性序列化为字符串,并在反序列化操作中,将字符串反序化为 Key 属性。...使用建议 在使用 System.Text.Json 进行序列化和反序列化操作时,如果要处理字典中 Key 为自定义类型问题,可以通过定义一个自定义 JSON 转换器来解决。...总结 本文通过一个实例,介绍了如何使用 System.Text.Json 进行序列化和反序列化操作时,处理字典中 Key 为自定义类型问题。

31620
  • 从 Newtonsoft.Json 迁移到 System.Text.Json

    3.大小写 默认情况下两者序列化都是 Pascal 命名,及首字母大写,在 JavaScript 以及 Java 等语言中默认是使用驼峰命名,所以在实际业务中是离不开使用驼峰。...4.带引号数字 在标准 Json 里,数字类型是不带引号,如:{"Name":"xiaoshi","Age":18},但有时我们可能会遇到标准异类,Newtonsoft.Json 默认是支持直接反序化为数字类型...5.Json DOM 直接反序化为对象,比如 Newtonsoft.Json 里 JObject.Parse。...特性指定使用反序列化构造方法,两者是一致。...Newtonsoft.Json System.Text.Json 支持范围广泛类型 ⚠️ ⚠ 将推断类型反序化为 object 属性 ⚠️ ⚠ 将 JSON null 文本反序化为不可为 null

    2.3K40

    .NET性能系列文章二:Newtonsoft.Json vs System.Text.Json

    第二是许多小数据集序列化和反序列化。 一个真实场景也需要真实数据。对于测试数据集,我决定使用 NuGet 包Bogus[5]。...在下面的基准中,我们将再次使用 Bogus,创建一组用户,但这次我们要把它们序列化为一个大字符串,用于大数据对象,并把许多小数据对象序列化为List。...第一个反序列化基准将一个大 JSON 字符串反序化为相应.NET 对象。...在这里,我们使用我们在上面的GlobalSetup()方法中初始化List,在一个循环中反序列化数据对象: [Benchmark(Baseline = true)] public void...我甚至认为,可以推断出结果,目前使用System.Text.Json比Newtonsoft.Json更快。 请记住,这些结果只对最新.NET 7 有效。

    1.4K30

    ASP.NET Core Web API设置响应输出Json数据格式两种方式

    前言 在ASP.NET Core Web API中设置响应输出Json数据格式有两种方式,可以通过添加System.Text.Json或Newtonsoft.JsonJSON序列化和反序列化库在应用程序中全局设置接口响应...Json数据格式,本文示例使用是新Minimal API模式。...JSON序列化和反序列化库 System.Text.Json System.Text.Json是 .NET Core 3.0 及以上版本中内置 JSON 序列化和反序列化库。...设置Json统一格式需求 修改属性名称序列化方式,在.Net Core中默认使用小驼峰序列化Json属性参数,前端想要使用与后端模型本身命名格式输出(如:UserName)。...(例如驼峰大小写)或为空以保持属性名称不变策略[前端想要使用与后端模型本身命名格式输出]。

    75410

    .NET 6+ 中源生成器诊断

    如果你遇到其中一个生成警告或错误,请按照为参考部分列出诊断 ID 提供具体指导进行操作。 还可以使用特定 SYSLIB1XXX 诊断 ID 值来取消警告。 有关详细信息,请参阅取消警告。...SYSLIB1021 多个消息模板项名称只是大小写不同 SYSLIB1022 不能使用格式错误格式字符串(例如不成对大括号) SYSLIB1023 不支持生成六个以上参数 SYSLIB1030...System.Text.Json 源生成器未生成类型序列化元数据 SYSLIB1031 System.Text.Json 源生成器遇到重复 JsonTypeInfo 属性名称 SYSLIB1032...] 注释 SYSLIB1037 System.Text.Json 源生成器遇到具有仅初始化属性类型,这些属性不支持反序列化 SYSLIB1038 System.Text.Json 源生成器遇到使用 [...JsonInclude] 注释属性,该属性具有不可访问访问器 禁止显示警告 建议尽量使用解决方法之一。

    56420

    Unity3D网络通讯(一)--Asp.Net Core WebApi创建发布注意事项

    02 发布时注意事项 由于我自己是Windows系统,所以发布还是和MVC一样用是文件格式发布。 ?...03 Json大小写问题 其实按照上面两步,基本我们IIS网站也搭建成,可以正常使用了,不过我在用Unity3D调用时候发现Json反序列化时对应类值都解析不出来,搜索查了一下原因是Unity3D...默用Json序列化组件是JsonUnity,它对大小写比较敏感,而NetCore3.1之后默认序列化组件改为了System.Text.Json,序列化默认行为有变。...默认System.Text.Json与Newtonsoft.Json序列化对比,可以看到默认System.Text.Json中把我们类属性全都转为小写了,而用了Newtonsoft.Json后还是按类属性原值输出...改为NewtonsoftJson后,Unity3D使用JsonUnity也可以正常反序列化了。 Controller代码 ?

    1.4K10

    .NET Core 3.0之深入源码理解Configuration(三)

    ().ParseStream(input); 该方法通过读取输入数据流,将其转化为字典类型配置数据,该字典类型是SortedDictionary类型,并且不区分大小写,此处需要注意。...这也呼应了之前所说.NET Core Configuration对外使用时候,都是以字典方式去提供给外界使用。...JsonDocument处理StreamReader数据,JsonDocument又是什么呢,通过命名空间我们知道,它位于System.Text.Json中,这是.NET Core原生处理JSON组件...主要是针对Object和Array类型进行了递归遍历,以便在诸如Number、String等简单类型时跳出递归,并存放到字典中,需要再次强调是,存放在字典值是以String类型存储。...至此,JsonConfigurationFileParser完成了从文件读取内容并转化为键值对工作。

    61620

    Object与json字符串相互转换

    提示2:当使用fastjson将json字符串转化为对象时,fastjson默认是对大小写不敏感。...提示3:我们在将对象转化为json字符串时,可以使用@JSONField()注解来初步做一些 配置,如:设置某一属性转换为指定keyjson值、设置该属性对应值在...提示4:我们在将json字符串反序化为对象时,可以使用@JSONField注解alternateNames属 性(或name)来指定反序列化时对应字段。...注:name属性在序列化、反序列化时,都会起作用;而alternateNames属性只会在反序 化时,才会起作用。...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    6.1K20

    mysql大小写敏感与校对规则

    那么mysql中大小写敏感是如何控制;数据库名,表名,字段名这些字典对象以及字段值大小敏感是如何控制;以及校验规则与索引关系,这是本文要讨论内容。...大小写区分规则: Linux下: 数据库名与表名是严格区分大小写; 表别名是严格区分大小写; 列名与别名在所有的情况下均是忽略大小写; 变量名也是严格区分大小写...mysql中控制数据库名和表名大小写敏感由参数lower_case_table_names控制,为0时表示区分大小写,为1时,表示将名字转化为小写后存储,区分大小写。...为了避免大小写引发问题,一种推荐命名规则是:在定义数据库、表、时候全部采用小写字母加下划线方式,不使用任何大写字母。 字段名和字段值: 字段名通常都是区分大小写。...比如 utf8字符集,utf8_general_ci,表示区分大小写,这个是utf8字符集默认校对规则;utf8_general_cs表示区分大小写,utf8_bin表示二进制比较,同样也区分大小写

    5.1K10

    使用 C# 9 records作为强类型ID - JSON序列化

    在本系列上一篇文章中,我们注意到强类型ID实体,序列化为 JSON 时候报错了,就像这样: { "id": { "value": 1 }, "name":..."Apple", "unitPrice": 0.8 } 不过想了一下,这样意外也是在意料之中,强类型ID是record类型,而不是原始类型,因此将其序列化为一个对象是有意义,但这显然不是我们想要...System.Text.Json 在最新版本ASP.NET Core(从3.0)中,默认JSON序列化程序是System.Text.Json,因此让我首先介绍这种。...options.JsonSerializerOptions.Converters.Add( new StronglyTypedIdJsonConverterFactory()); }); Newtonsoft.Json 如果您项目使用是...它和 System.Text.Json 转换器非常相似,不同之处在于Newtonsoft.Json没有转换器工厂(ConvertFactory)概念,相反,我们将编写一个非泛型转换器: public

    1.4K10

    如何把MysSQL设置为大小写敏感

    MySQL在windows下是区分大小写,将script文件导入MySQL后表名也会自动转化为小写,结果再 想要将数据库导出放到linux服务器中使用时就出错了。...因为在linux下表名区分大小写而找不到表,查了很多都是说在linux下更改MySQL设置使其也区分大小写,但是有没有办法反过来让windows 下大小写敏感呢。...具体操作: 在MySQL配置文件my.ini中增加一行: lower_case_table_names = 0 其中 0:区分大小写,1:区分大小写 MySQL在Linux下数据库名、表名、...列名、别名大小写规则是这样:    1、数据库名与表名是严格区分大小写;    2、表别名是严格区分大小写;    3、列名与别名在所有的情况下均是忽略大小写;   ...4、变量名也是严格区分大小写; MySQL在Windows下都不区分大小写

    1.5K40

    django-7-django模型系统

    TestFiled  DateFiled  AutoFiled(primary_key=True)自增,指定主键会自动创建 在使用时候何以设置DateField.auto_now每次自动保存对象时候自动设置改字段为当前时间...) 根据给定条件获取过滤后queryset,多个条件用','连接  exclude(**kwargs) 作用和filter相反,去除不符合条件对象  多条件or连接  from django.db.models...import Q  Q(age=1) | Q(age=0)  返回某个字段  values(*fileds) field指定字段,返回一个queryset,返回一个‘字典列表’  only(*fields...  如果要反序就在field前加'-'  切片 和python切片用法相似,不支持复索引,数据大时候不用步长  ***切片后不再支持附加条件与排序  *多字段排序有什么用?...*  常用查询条件  > < =  通过'__' 使用  exact 默认等于  iexact 区分大小写匹配  contains  icontains 区分大小写  in name__in =

    80910

    System.Text.Json 自定义 Conveter

    System.Text.Json 自定义 Conveter Intro System.Text.Json 作为现在 .NET 默认提供高性能 JSON 序列化器,对于一些比较特殊类型支持并不太好,业务需求中总是有各种各样需要...如果 Id 只会是整数或者整数字符串,那么我们就可以用 int 来表示,System.Text.Json 从 5.0 开始支持解析带引号数字,也就是数字字符串形式可以参考:https://github.com.../dotnet/runtime/issues/30255,只需要配置 JsonNumberHandling, 在 ASP.NET Core 中默认是启用,是可以把 "1" 反序列化成一个 int 类型...Converter 方式有两种,一种是在某个属性上添加 JsonConverter 来使用,另一种是作为全局 Converter 来使用,直接配置 JsonSerializerOptions 中...Name); 输出结果如下: output More 可能你会问为什么直接用 object,如果使用 object 的话,上面的 Equals 判断就要改写了,需要自己重新实现比较逻辑,而用 string

    60640

    php 生成签名规则

    /** * 生成接口sign * 将获得signStr进行md5加密候转化成大写,再拼接密钥,再md5加密,并且转化为大写 * 签名生成通用步骤如下: *...* 第一步,设所有发送数据非空参数值参数按照参数名ASCII码从小到大排序(字典序), * 使用URL键值对格式(即key1:value1key2:value2…)拼接成字符串...* * 第二步,将获得signStr进行md5加密候转化成大写,再拼接密钥,再md5加密,并且转化为大写 * * 第三步,第二步结果就是最终签名signStr...* * 特别注意以下重要规则: * * ◆ 参数名ASCII码从小到大排序(字典序); * ◆ 如果参数值为空参与签名; * ◆ 参数名区分大小写;...哪一种加密 * 以下结果是 32位小写 md5加密结果))) * 将获得signStr进行md5加密候转化成大写,再拼接密钥,再md5加密,并且转化为大写, * 密钥与后端商定

    2K70

    php入门之字符串操作

    strcasecmp — 二进制安全比较字符串(区分大小写) strchr — 别名 strstr strcmp — 二进制安全字符串比较 strcoll — 基于区域设置字符串比较 strcspn...stripos — 查找字符串首次出现位置(区分大小写) stripslashes — 反引用一个引用字符串 stristr — strstr 函数忽略大小写版本 strlen — 获取字符串长度...strnatcasecmp — 使用“自然顺序”算法比较字符串(区分大小写) strnatcmp — 使用自然排序算法比较字符串 strncasecmp — 二进制安全比较字符串开头若干个字符...(区分大小写) strncmp — 二进制安全比较字符串开头若干个字符 strpbrk — 在字符串中查找一组字符任何一个字符 strpos — 查找字符串首次出现位置 strrchr...— 查找指定字符在字符串中最后一次出现 strrev — 反转字符串 strripos — 计算指定字符串在目标字符串中最后一次出现位置(区分大小写) strrpos — 计算指定字符串在目标字符串中最后一次出现位置

    16920

    自定义Key类型字典无法序列化N种解决方案

    当我们使用System.Text.Json.JsonSerializer对一个字典对象进行序列化时候,默认情况下字典Key不能是一个自定义类型,本文介绍几种解决方案。...顺便说一下,如果使用Newtonsoft.Json,这样字典可以序列化成功,但是反序列化会失败。 二、自定义JsonConverter能解决吗?...遇到这样问题我们首先想到是:既然执行针对Point序列化/反序列化,那么我们可以对应相应JsonConverter自行完成序列化/反序列化工作。...我们知道字典本质上就是键值对集合,而集合针对元素类型并没有特殊约束,所以我们完全可以按照键值对集合方式来进行序列化和反序列化。...Read方法中,我们采用相同方式得到这个针对IEnumerable>类型JsonConverter,并将其反序列化成键值对集合,在转换成返回字典

    15410

    开源 , KoobooJson一款高性能且轻量JSON框架

    排序特性 DictionaryKey格式 JObject和JArray 忽略默认值元素 忽略序列化元素 序列化时仅包含该元素 时间格式 首字母大小写 别名特性 反序列化时指定构造函数 值格式化特性..., 避免字典查询开销, 避免装箱拆箱消耗, 缓冲池复用, 加速字节复制......上图是使用BenchmarkDotNet在Net Core2.1上做Json序列化和反序列化性能测试,随机生成大量测试数据,迭代100次后产生结果,基准报告在这里 BenchmarkDotNet...将考虑在下个版本中构建一个轻便char容器, 并会区分对象大小, 考虑栈数组和通过预扫描大小来减少对内存开销,这将显著提升序列化速度....,反序列化时也可以设置对字符串区分大小写.首字母大小写属于内嵌支持, 在解析时并不会影响性能 别名特性 class A { [Alias("R01_Name")] public

    1.7K10
    领券