2010-10-13 163 views
18

我正在使用http://json.codeplex.com/,我正在与基于Ruby的Rest API进行通信。问题是,大多数属性都有一个红宝石下划线的命名约定。我想知道如果有人知道一种方式,以便我可以避免必须添加大量的JsonProperty。遵循Ruby属性命名约定的C#JSON.NET约定?

比如我想避免添加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; } 
} 

回答

30

更新 - 2016年9月:

Json.NET 9.0.1 SnakeCaseNamingStrategy。您可以使用它自动拥有twitter_screen_name样式属性。


继承DefaultContractResolver并覆盖ResolvePropertyName格式化属性名称,只要你愿意。

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

+0

谢谢詹姆斯会给我一个机会,并将我的发现发布给其他可能遇到这种情况的人。 – superlogical 2010-10-15 11:07:56

30

阅读: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(); 
     } 
    } 
+0

这对于连续两个大写字母的属性不起作用。 'ThisIsATest'变成'this_is_atest'。 – vaindil 2016-08-22 20:47:49

4

这一个为我工作

var settings = new JsonSerializerSettings 
{ 
    ContractResolver = new PascalCaseToUnderscoreContractResolver() 
}; 
var rawJson = "{ test_property:'test' }" 
var myObject = JsonConvert.DeserializeObject<MyObjectType>(rawJson, settings); 

使用Humanizer功能 “下划线”

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;} 
} 
7

截至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);