遵循Ruby属性命名约定的C#JSON.NET约定?

遵循Ruby属性命名约定的C#JSON.NET约定?,c#,ruby,api,json.net,C#,Ruby,Api,Json.net,我正在使用一个基于Ruby的RESTAPI。问题是大多数属性都有ruby下划线命名约定。我想知道是否有人知道一种方法,这样我就可以避免添加大量JsonProperty 例如,我希望避免添加JsonProperty属性,并在序列化程序设置中内置一个约定,以便它知道如何尝试将中带有下划线的属性映射到.NET命名约定:) 更新-2016年9月: Json.NET 9.0.1具有。您可以使用它自动拥有twitter\u屏幕\u名称样式属性 从DefaultContractResolver继承并重写Re

我正在使用一个基于Ruby的RESTAPI。问题是大多数属性都有ruby下划线命名约定。我想知道是否有人知道一种方法,这样我就可以避免添加大量JsonProperty

例如,我希望避免添加JsonProperty属性,并在序列化程序设置中内置一个约定,以便它知道如何尝试将中带有下划线的属性映射到.NET命名约定:)


更新-2016年9月:

Json.NET 9.0.1具有。您可以使用它自动拥有twitter\u屏幕\u名称样式属性


DefaultContractResolver
继承并重写
ResolvePropertyName
,以根据需要格式化属性名称

CamelCasePropertyNamesContractResolver对属性名称进行了类似的全局更改。

阅读以下内容:

这个对我有用 MyObjectType类
从版本9开始,存在一个新的命名策略属性来实现这一点,并且它有一个内置类。使用下面的代码,并将
contractResolver
注册为
SerializerSettings.contractResolver

var contractResolver = new DefaultContractResolver();
contractResolver.NamingStrategy = new SnakeCaseNamingStrategy();
默认情况下,该类不包括字典,并且不会覆盖任何手动设置的属性值。这是可以在重载中传递的两个参数:

// true parameter forces handling of dictionaries
// false prevents the serializer from changing anything manually set by an attribute
contractResolver.NamingStrategy = new SnakeCaseNamingStrategy(true, false);

感谢James尝试一下,并在这里为可能遇到这种情况的其他人发布我的发现。仅供参考,通常使用命名策略的合同解析程序存在潜在的巨大性能问题。使用一个(90 tps)与不使用一个(600 tps)时的吞吐量大幅降低。重用契约解析器。每次创建一个新的将强制在每次序列化/反序列化时进行反射。这不适用于具有两个连续大写字母的属性<代码>此为测试
变为
此为测试
var settings = new JsonSerializerSettings
{
    ContractResolver = new PascalCaseToUnderscoreContractResolver()
};
var rawJson = "{ test_property:'test' }"
var myObject = JsonConvert.DeserializeObject<MyObjectType>(rawJson, settings);
public class PascalCaseToUnderscoreContractResolver : DefaultContractResolver
{
    protected override string ResolvePropertyName(string propertyName) => propertyName.Underscore();
}
public Class MyObjectType
{
    public string TestProperty {get;set;}
}
var contractResolver = new DefaultContractResolver();
contractResolver.NamingStrategy = new SnakeCaseNamingStrategy();
// true parameter forces handling of dictionaries
// false prevents the serializer from changing anything manually set by an attribute
contractResolver.NamingStrategy = new SnakeCaseNamingStrategy(true, false);