2010-10-13 120 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);