2010-10-13 16 views
18

Estoy usando http://json.codeplex.com/ y estoy hablando con una API Rest 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.C# Convención JSON.NET que sigue las convenciones de nombres de propiedad de Ruby?

Por ejemplo quiero evitar añadir el atributo JsonProperty y se han integrado en una convención de la configuración serializador para que sepa tratar de propiedades del mapa con un guión en el que la convención de nombres .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; } 
} 

Respuesta

30

actualización - Septiembre 2016:

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


Heredar del DefaultContractResolver y anular ResolvePropertyName para formatear los nombres de propiedades como desee.

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

+0

Gracias James le dará una oportunidad y publicará mis hallazgos aquí para otros que puedan encontrarse con esta situación. – superlogical

30

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, @"([A-Z])([A-Z][a-z])|([a-z0-9])([A-Z])", "$1$3_$2$4").ToLower(); 
     } 
    } 
+0

Esto no funciona para las propiedades con dos letras mayúsculas consecutivas. 'ThisIsATest' se convierte en' this_is_atest'. – vaindil

4

Éste trabajó para mí

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

Usando Humanizer función "Subrayado"

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

partir de la versión 9, una propiedad nueva estrategia de nomenclatura existe para ello, y tiene incorporado un SnakeCaseNamingStrategy clase. Utilice el siguiente código y regístrese 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 se pueden pasar 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); 
Cuestiones relacionadas