首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >遵循C#属性命名约定的Ruby JSON.NET约定?

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

Stack Overflow用户
提问于 2010-10-13 18:53:02
回答 3查看 10.7K关注 0票数 23

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

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

代码语言:javascript
复制
public class Member
{
    [JsonProperty(PropertyName = "avatar_url")]
    public string AvatarUrl { get; set; }

    [JsonProperty(PropertyName = "twitter_screen_name")]
    public string TwitterScreenName { get; set; }

    [JsonProperty(PropertyName = "website_url")]
    public string WebSiteUrl { get; set; }
}
EN

回答 3

Stack Overflow用户

发布于 2011-09-02 02:54:14

请阅读:http://nyqui.st/json-net-newtonsoft-json-lowercase-keys

代码语言:javascript
复制
public class UnderscoreMappingResolver : DefaultContractResolver 
    {
        protected override string ResolvePropertyName(string propertyName)
        {
            return System.Text.RegularExpressions.Regex.Replace(
                propertyName, @"([A-Z])([A-Z][a-z])|([a-z0-9])([A-Z])", "$1$3_$2$4").ToLower(); 
        }
    }
票数 30
EN

Stack Overflow用户

发布于 2016-08-23 07:09:48

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

代码语言:javascript
复制
var contractResolver = new DefaultContractResolver();
contractResolver.NamingStrategy = new SnakeCaseNamingStrategy();

默认情况下,该类不包括字典,也不重写任何手动设置的属性值。这是可以在重载中传递的两个参数:

代码语言:javascript
复制
// true parameter forces handling of dictionaries
// false prevents the serializer from changing anything manually set by an attribute
contractResolver.NamingStrategy = new SnakeCaseNamingStrategy(true, false);
票数 13
EN

Stack Overflow用户

发布于 2016-04-14 16:58:23

这个很适合我

代码语言:javascript
复制
var settings = new JsonSerializerSettings
{
    ContractResolver = new PascalCaseToUnderscoreContractResolver()
};
var rawJson = "{ test_property:'test' }"
var myObject = JsonConvert.DeserializeObject<MyObjectType>(rawJson, settings);

使用人性化函数“下划线”

https://www.nuget.org/packages/Humanizer/1.37.7

http://humanizr.net/#underscore

代码语言:javascript
复制
public class PascalCaseToUnderscoreContractResolver : DefaultContractResolver
{
    protected override string ResolvePropertyName(string propertyName) => propertyName.Underscore();
}

MyObjectType类

代码语言:javascript
复制
public Class MyObjectType
{
    public string TestProperty {get;set;}
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3922874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档