代码之家  ›  专栏  ›  技术社区  ›  superlogical

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

  •  20
  • superlogical  · 技术社区  · 15 年前

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

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

    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; }
    }
    
    4 回复  |  直到 13 年前
        1
  •  34
  •   James Newton-King dbc    9 年前

    更新-2016年9月:

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


    继承自 DefaultContractResolver 和覆盖 ResolvePropertyName 设置属性名称的格式。

    CamelCasePropertyNamesContractResolver 对属性名执行类似的全局更改。

        2
  •  30
  •   Krlos    14 年前

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

    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(); 
            }
        }
    
        3
  •  11
  •   vaindil    10 年前

    从版本9开始,存在一个新的命名策略属性来执行此操作,并且它有一个内置的 SnakeCaseNamingStrategy 上课。使用下面的代码并注册 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);
    
        4
  •  4
  •   Michael    10 年前

    这个对我有用

    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

    public class PascalCaseToUnderscoreContractResolver : DefaultContractResolver
    {
        protected override string ResolvePropertyName(string propertyName) => propertyName.Underscore();
    }
    

    MyObjectType类

    public Class MyObjectType
    {
        public string TestProperty {get;set;}
    }
    
    推荐文章