2010-10-13 71 views
18

Tôi đang sử dụng http://json.codeplex.com/ và tôi đang nói chuyện với một API dựa trên Ruby Rest. Vấn đề là hầu hết các thuộc tính đều có quy ước đặt tên gạch dưới ruby. Tôi tự hỏi nếu có ai biết một cách để tôi có thể tránh phải Thêm rất nhiều JsonProperty.C# quy ước JSON.NET tuân theo quy ước đặt tên thuộc tính Ruby?

Ví dụ tôi muốn tránh thêm các thuộc tính JsonProperty và đã một quy ước xây dựng vào các thiết lập serializer để nó biết để thử và thuộc tính bản đồ với một dấu gạch dưới trong Công ước NET đặt tên :)

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

Trả lời

30

cập nhật - tháng 9 năm 2016:

Json.NET 9.0.1 có SnakeCaseNamingStrategy. Bạn có thể sử dụng tính năng này để tự động điền thuộc tính style theo kiểu twitter_screen_name.


Kế thừa từ DefaultContractResolver và ghi đè ResolvePropertyName để định dạng tên thuộc tính như bạn muốn.

CamelCasePropertyNamesContractResolver thực hiện thay đổi toàn cầu tương tự đối với tên thuộc tính.

+0

Cảm ơn James sẽ chụp ảnh và đăng phát hiện của tôi ở đây cho những người khác có thể gặp phải tình huống này. – superlogical

30

đọc này: 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

Điều này không hoạt động đối với các thuộc tính có hai chữ cái viết hoa liên tục. 'ThisIsATest' trở thành' this_is_atest'. – vaindil

4

một này làm việc cho tôi

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

Sử dụng Humanizer chức năng "gạch"

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 lớp

public Class MyObjectType 
{ 
    public string TestProperty {get;set;} 
} 
7

Tính đến phiên bản 9, một tài sản chiến lược đặt tên mới tồn tại để làm điều này, và nó có một built-in SnakeCaseNamingStrategy lớp. Sử dụng mã bên dưới và đăng ký contractResolverSerializerSettings.ContractResolver.

var contractResolver = new DefaultContractResolver(); 
contractResolver.NamingStrategy = new SnakeCaseNamingStrategy(); 

Lớp học đó không bao gồm từ điển theo mặc định và không ghi đè bất kỳ giá trị thuộc tính được đặt theo cách thủ công nào. Đó là hai thông số có thể được truyền trong tình trạng quá tải:

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