C # JSON.NET convención que sigue las convenciones de nombres de propiedad de Ruby?

Estoy usando http://json.codeplex.com/ y estoy hablando con una Rest API basada en Ruby. El problema es que la mayoría de las propiedades tienen una convención de nomenclatura de subrayado ruby. Me pregunto si alguien sabe de alguna manera, así que puedo evitar tener que agregar muchos JsonProperty.

Por ejemplo, quiero evitar agregar el atributo JsonProperty y tener una convención incorporada en la configuración del serializador para que sepa tratar de mapear propiedades con un guión bajo en la convención de nomenclatura .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; } } 

Actualización – septiembre de 2016:

Json.NET 9.0.1 tiene SnakeCaseNamingStrategy . Puede usar eso para tener propiedades de estilo twitter_screen_name automáticamente.


Herede DefaultContractResolver y anule ResolvePropertyName para formatear los nombres de propiedad como desee.

CamelCasePropertyNamesContractResolver realiza un cambio global similar a los nombres de propiedades.

Lea esto: 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, @"([AZ])([AZ][az])|([a-z0-9])([AZ])", "$1$3_$2$4").ToLower(); } } 

A partir de la versión 9, existe una nueva propiedad de estrategia de nombres para hacer esto, y tiene una clase SnakeCaseNamingStrategy incorporada . Use el código a continuación y registre contractResolver como SerializerSettings.ContractResolver .

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

Esa clase no incluye diccionarios por defecto, y no anula ningún valor de propiedad establecido manualmente. Esos son los dos parámetros que pueden pasarse en la sobrecarga:

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

Este funcionó para mí

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

Usando la función Humanizer “Subrayar”

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

Clase MyObjectType

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