带有下划线的牛顿驼峰命名法问题

2024-04-17

我注意到,当我序列化具有 HTTP_VERB 键的 C# 字典时,它会变成httP_VERB在 JSON 结构中而不是 hTTP_VERB 或 http_verb 我希望驼峰式大小写能够实现。

这是我用来重现该问题的代码:

  class Program {
    static void Main(string[] args) {

      var settings = new JsonSerializerSettings();

      settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
      settings.NullValueHandling = NullValueHandling.Ignore;

      var headers = new Dictionary<string, string>();
      headers["SessionID"] = "123456";
      headers["HTTP_VERB"] = "POST";
      headers["HTTPVERSION"] = "1";
      var data = new
      {
        headers = headers
      };

      string serializedEvent = JsonConvert.SerializeObject(data, settings);

      if (serializedEvent.Contains("httP_VERB")) {
        Console.WriteLine("Something is wrong with this camel case");
      }
      else {
        Console.WriteLine("Sucess");
      }

    }
  }

没有办法制作CamelCasePropertyNamesContractResolver按照您想要的方式将字符串转换为驼峰式大小写,但您可以轻松编写自己的字符串ContractResolver.

我在我的应用程序中使用了 PascalCase 转换CsCss https://github.com/Athari/CsCss/blob/master/Alba.CsCss/T4/Common.ttinclude项目。经过一番调整后,结果如下:

public enum IdentifierCase
{
    Camel,
    Pascal,
}

public class CustomPropertyNamesContractResolver : DefaultContractResolver
{
    private static readonly CultureInfo Culture = CultureInfo.InvariantCulture;

    public CustomPropertyNamesContractResolver (bool shareCache = false)
        : base(shareCache)
    {
        Case = IdentifierCase.Camel;
        PreserveUnderscores = true;
    }

    public IdentifierCase Case { get; set; }
    public bool PreserveUnderscores { get; set; }

    protected override string ResolvePropertyName (string propertyName)
    {
        return ChangeCase(propertyName);
    }

    private string ChangeCase (string s)
    {
        var sb = new StringBuilder(s.Length);

        bool isNextUpper = Case == IdentifierCase.Pascal, isPrevLower = false;
        foreach (var c in s) {
            if (c == '_') {
                if (PreserveUnderscores)
                    sb.Append(c);
                isNextUpper = true;
            }
            else {
                sb.Append(isNextUpper ? char.ToUpper(c, Culture) : isPrevLower ? c : char.ToLower(c, Culture));
                isNextUpper = false;
                isPrevLower = char.IsLower(c);
            }
        }
        return sb.ToString();
    }

    // Json.NET implementation for reference
    private static string ToCamelCase (string s)
    {
        if (string.IsNullOrEmpty(s) || !char.IsUpper(s[0]))
            return s;
        var sb = new StringBuilder();
        for (int i = 0; i < s.Length; ++i) {
            if (i == 0 || i + 1 >= s.Length || char.IsUpper(s[i + 1]))
                sb.Append(char.ToLower(s[i], Culture));
            else {
                sb.Append(s.Substring(i));
                break;
            }
        }
        return sb.ToString();
    }
}

该转换器同时支持PascalCase and camelCase。它似乎按照您期望的方式转换属性名称。

我已经离开了原来的ToCamelCase来自 Json.NET 的函数供参考。

示例程序:

internal class Program
{
    private static void Main ()
    {
        var obj = new Dictionary<string, string> {
            { "SessionID", "123456" },
            { "HTTP_VERB", "POST" },
            { "HTTPVERSION", "1" },
        };
        var settings = new JsonSerializerSettings {
            Formatting = Formatting.Indented,
            ContractResolver = new CustomPropertyNamesContractResolver()
        };
        string strCamel = JsonConvert.SerializeObject(obj, settings);
        Console.WriteLine("camelCase: \n" + strCamel);
        Console.WriteLine(strCamel.Contains("httP_VERB") ? "Something is wrong with this camel case" : "Success");
        settings.ContractResolver = new CustomPropertyNamesContractResolver {
            Case = IdentifierCase.Pascal,
            PreserveUnderscores = false,
        };
        string strPascal = JsonConvert.SerializeObject(obj, settings);
        Console.WriteLine("PascalCase: \n" + strPascal);
        Console.ReadKey();
    }
}

Output:

camelCase:
{
  "sessionId": "123456",
  "http_Verb": "POST",
  "httpversion": "1"
}
Success
PascalCase:
{
  "SessionId": "123456",
  "HttpVerb": "POST",
  "Httpversion": "1"
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有下划线的牛顿驼峰命名法问题 的相关文章

  • 编写此代码片段的有效方法是什么? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 更有效和 或更短地重写此代码以节省字节并显得不那么冗长的方法 if N 2 0 N 6 N 8 N 10 N 12 N 14 N 16 N
  • 如何使用 ASP.NET MVC 编辑多选列表?

    我想编辑一个如下所示的对象 我希望用 UsersGrossList 中的一个或多个用户填充 UsersSelectedList 使用 mvc 中的标准编辑视图 我只得到映射的字符串和布尔值 下面未显示 我在 google 上找到的许多示例都
  • 元组在 VS2012 中如何工作?

    Visual Studio 2012 功能 tuples但不是可变参数模板 这是如何完成的 如何在不使用可变模板的情况下实现元组 简而言之 微软做了与之前在 NET 中实现类似元组的数据类型完全相同的事情 创建许多版本 每个版本都有固定数量
  • 我如何知道 C 程序的可执行文件是在前台还是后台运行?

    在我的 C 程序中 我想知道我的可执行文件是否像这样在前台运行 a out 或者像这样 a out 如果你是前台工作 getpgrp tcgetpgrp STDOUT FILENO or STDIN FILENO or STDERR FIL
  • C# 处理标准输入

    我目前正在尝试通过命令行断开与网络文件夹的连接 并使用以下代码 System Diagnostics Process process2 new System Diagnostics Process System Diagnostics Pr
  • 为什么需要数字后缀?

    C 语言 我确信还有其他语言 需要在数字文字末尾添加后缀 这些后缀指示文字的类型 例如 5m是一个小数 5f是一个浮点数 我的问题是 这些后缀真的有必要吗 或者是否可以从上下文中推断出文字的类型 例如 代码decimal d 5 0应该推断
  • 将日期时间转换为指定格式

    我有这个日期格式yy MM dd HH mm ss ex 12 02 21 10 56 09 问题是 当我尝试使用以下代码将其转换为不同格式时 CDate 12 02 21 10 56 09 ToString MMM dd yyyy HH
  • 有什么方法可以重载 C# 中的扩展方法吗?

    我有以下模型模式 public abstract class PARENTCLASS public class CHILD A CLASS PARENTCLASS public static class EXTENSION public s
  • 如何使用 Roslyn 通过扩展方法、静态类中的方法以及带有 ref/out 参数的方法来访问调用

    我正在致力于创建一个开源项目 用于创建 NET UML 序列图 该项目利用名为 js sequence diagrams 的 javascript 库 我不确定 Roslyn 是适合这项工作的工具 但我想我应该尝试一下 所以我整理了一些概念
  • 用于连接 DataTable 上的动态列的动态 LINQ

    我目前遇到的情况不确定如何继续 我有两个从数据库填充的数据表 我还有一个可用的列名称列表 可用于将这两个数据表连接在一起 我希望编写一组 LINQ 查询 这些查询将 显示两个数据表中的行 内部联接 用于从一个数据表更新另一个数据表 显示一个
  • Xamarin - SignalR 挂在连接上

    我正在尝试将我的 Xamarin 应用程序连接到托管在 Azure 上的 SignalR 后端 我遇到的问题是每次我在 HubConnection 上调用 StartAsync 时 它都会挂起客户端并且请求永远不会完成 我尝试通过应用程序进
  • 如何在 C# 中获取 Json 数组?

    我有一个像这样的 Json 字符串 我想将它加载到 C 数组中 当我尝试这样做时 我收到异常 我的字符串 customerInformation customerId 123 CustomerName Age 39 Gender Male
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • 使用多线程进行矩阵乘法?

    我应该使用线程将两个矩阵相乘 有两件事 当我运行程序时 我不断得到 0 我还收到消息错误 对于每个错误 它在粗体行上显示 警告 从不兼容的指针类型传递 printMatrix 的参数1 我尝试打印输出 还要注意 第一个粗体块 这是我解决问题
  • ALTER TABLE ... ADD CONSTRAINT 失败时将事务回滚到保存点

    有没有办法在事务中添加检查约束and如果失败回滚到以前的保存点 而不是回滚整个事务 就我而言 当 ALTER TABLE ADD CONSTRAINT 命令失败时 事务无法回滚到保存点 尝试这样做会引发 InvalidOperationEx
  • 无法在 C# 中为 EventArgs 分配使用派生类型的事件处理程序

    所以我有一个事件声明如下 public event EventHandler OnChangeDetected 然后我有以下处理程序被分配给该事件 myObject OnChangeDetected OnTableChanged 我的理解是
  • Xamarin.Forms UWP 项目中标题栏和选项卡之间令人恼火的空白

    我几乎是新手Xamarin Forms我正在开发一个相当简单的跨平台应用程序 该应用程序在 Android 中显示得足够好 但在 UWP 中却出现了一个愚蠢的空白 该项目由一个 TabbedPage 组成 其中包含 4 个 Navigati
  • 如何提高环复杂度?

    对于具有大量决策语句 包括 if while for 语句 的方法 循环复杂度会很高 那么我们该如何改进呢 我正在处理一个大项目 我应该减少 CC gt 10 的方法的 CC 并且有很多方法都存在这个问题 下面我将列出一些例如我遇到的问题的
  • 为什么表达式 a = a + b - ( b = a ) 在 C++ 中给出序列点警告?

    以下是测试代码 int main int a 3 int b 4 a a b b a cout lt lt a lt lt a lt lt lt lt b lt lt b lt lt n return 0 编译此命令会出现以下警告 gt g
  • 嵌入式二进制资源 - 如何枚举嵌入的图像文件?

    我按照中的说明进行操作这本书 http www apress com book view 9781430225492 关于资源等的章节 我不太明白的是 如何替换它 images Add new BitmapImage new Uri Ima

随机推荐

  • Android Studio 性能低下

    我昨天将 Android Studio 更新到了 2 3 版本 自从经历了性能缓慢之后 它之前工作得很好 虽然在 gradle 构建时很慢 但现在它占用了 100 的处理器资源 Android Studio 流畅运行需要什么条件 我的电脑运
  • 无法使用unixodbc、libmyodbc连接到远程mysql服务器

    我对此有点陌生 我希望我遇到的问题是一个简单的问题 编辑 底部的新信息 我需要连接到远程 mysql Amazon RDS 数据库 在学习了一些教程后 我在客户端上安装并配置了 unixodbc 和 libmyodbc 但是当我尝试通过 i
  • 无法将 go tool pprof 与现有服务器一起使用

    我有一个现有的 http 服务器 我想对其进行分析 我已经包括了 net http pprof 到我的导入 并且我已经运行了 http 服务器 router createRouter server http Server Addr 8080
  • 如何使用 Linux 帧缓冲区旋转 Qt5 应用程序?

    我有一个直接在 Linux 帧缓冲区 无 x Windows 上运行的嵌入式 Linux 应用程序 现在我们必须将显示屏物理旋转 180 度 如何让我的 Qt 应用程序旋转 使其不会出现颠倒 我看到参考使用以下选项 platform lin
  • 如何解决 ORA-00911: 无效字符错误?

    我试图执行一个SQL INSERT with Toad for oracle INSERT INTO GRAT ACTIVITY UUID IP ADRESS SEND MAIL DATE CREA DATE UPD CREATOR CEN
  • 在 pandas 数据帧上运行 sql 查询

    我有一个数据框 df ID Price Region 1 23 AUS 1 45 DXB 2 25 GER 2 18 TUN 我想用 python 编写代码以获得以下输出 ID Price Region 1 45 DXB 2 25 TUN
  • JTextArea 中控制字符的 Java 图像

    我正在编写一个由 2 个面板组成的应用程序 一个 JTextArea 用于输入文本 另一个用于显示文本 In these texts I have two special characters namely STX ETX 0x02 0x0
  • 如何纠正箱线图的标签,获取 R 中每对的 p 值

    我有一个数据样本如下 df lt tribble capacity1 capacity2 capacity3 capacity4 capacity5 capacity6 capacity7 capapcity8 75 88 85 71 98
  • XCode 8:找不到 AFNetworking 头文件和 Swift Pod 错误

    今天我把 XCode 升级到了 8 版本 但是之后我遇到了很多错误 前任 目标 Charts 和 CircleProgressView 包含使用早期版本的 Swift 开发的源代码 选择 转换 将这些目标中的源代码更新为 最新的 SDK 您
  • 代码适用于嵌入式 Apache Tomcat 8,但不适用于 9。发生了什么变化?

    将 Apache Tomcat 嵌入到 Eclipse Web 应用程序项目中 当我使用最新的 Tomcat 8 8 0 5 Embedded jar 作为依赖项时 该代码可以工作 并且该服务器响应于http 本地主机 8080 http
  • Java、巴拿马项目以及如何处理 Hunspell“建议”结果

    我正在尝试Hunspell https github com hunspell hunspell以及如何使用它与之交互巴拿马 Java 项目 https jdk java net panama 构建 19 巴拿马 1 13 2022 年 1
  • 如何在 Jackson 中禁用fail_on_empty_beans?

    使用 jackson 2 1 如何禁用fail on empty beans错误消息似乎要我禁用 我假设这只是世界上最简单的事情 但是现在已经晚了 我还没有找到一个简单的教程或任何特别明显的东西api SerializationFactor
  • 如何使用 PHP API [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有一个非常简单的 API 位于htt
  • 使用 Owin 从 JWT 获取自定义声明

    我使用 Owin 和 JWTBearerAuthentication 来授权用户并验证他们的令牌 我这样做是这样的 public class Startup public void Configuration IAppBuilder app
  • python setattr 用于带有装饰器的动态方法创建器

    我有一个定义了多个方法的类 import mat class Klass object mat sell mat CanSet def method1 self return None mat sell mat CanSet def met
  • 64 位定点乘法错误

    我正在 C 中实现一个 64 位定点有符号 31 32 数字类型 基于long 到目前为止 加法和减法都很顺利 然而 乘法有一个我正在尝试解决的恼人的情况 我当前的算法包括将每个操作数分为最高和最低有效 32 位 执行 4 次乘法分为 4
  • 资产管道升级导致 Paperclip 中的 Default_url 损坏

    我正在使用 Paperclip 并且我的附件之一有一个像这样的 default url 选项 default url gt images missing style png 由于目录已移动 资产管道显然不喜欢这样 处理这个问题的最佳方法是什
  • Spring MVC 控制器是单例吗?

    我有一个关于Spring 3 MVC Controllers 当请求到来时 容器是否为每个请求创建一个新的控制器实例 类似于Action在 Struts 2 中 ThreadLocalActionContext 还是单个实例响应所有请求 默
  • 从 F# 中存储为概率序列的离散分布函数中抽取随机数

    存在给定的有限长度 N 的浮点序列 介于 0 和 1 之间 表示整数 0 N 1 上的分布函数 我们试图从这个分布中抽取一个随机数 一种方法是在 0 1 浮点数 中绘制一个均匀随机变量 然后计算该数字的逆累积分布函数 如果分布在数组中 则代
  • 带有下划线的牛顿驼峰命名法问题

    我注意到 当我序列化具有 HTTP VERB 键的 C 字典时 它会变成httP VERB在 JSON 结构中而不是 hTTP VERB 或 http verb 我希望驼峰式大小写能够实现 这是我用来重现该问题的代码 class Progr