2010-10-13 9 views
18

J'utilise http://json.codeplex.com/ et je suis en train de parler à une API Rest basée sur Ruby. Le problème est que la plupart des propriétés ont une convention de nommage ruby ​​underscore. Je me demande si quelqu'un connaît un moyen pour que je puisse éviter d'avoir à ajouter beaucoup de JsonProperty.Convention C# JSON.NET qui suit les conventions de dénomination des propriétés Ruby?

Par exemple, je veux éviter d'ajouter l'attribut JsonProperty et ont une convention intégrée dans les paramètres de sérialiseur pour qu'il sache à essayer de propriétés de carte avec un trait de soulignement dans le à la convention de nommage .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; } 
} 

Répondre

30

Mise à jour - Septembre 2016:

Json.NET 9.0.1 a SnakeCaseNamingStrategy. Vous pouvez utiliser cela pour avoir automatiquement les propriétés de style twitter_screen_name.


Hériter de DefaultContractResolver et passer outre ResolvePropertyName au format des noms de propriété que vous souhaitez.

CamelCasePropertyNamesContractResolver fait un changement global similaire aux noms de propriété.

+0

Merci James va faire un essai et poster mes conclusions ici pour d'autres qui pourraient rencontrer dans cette situation. – superlogical

30

Lire ceci: 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

Ceci ne fonctionne pas pour les propriétés avec deux lettres majuscules consécutives. 'ThisIsATest' devient' this_est_atest'. – vaindil

4

Celui-ci a fonctionné pour moi

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

Utilisation de la fonction Humanizer "Souligné"

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

classe MyObjectType

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

de la version 9, une nouvelle propriété de stratégie de nommage existe pour le faire, et il a intégré dans SnakeCaseNamingStrategy classe. Utilisez le code ci-dessous et inscrivez contractResolver comme SerializerSettings.ContractResolver.

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

Cette classe n'inclut pas les dictionnaires par défaut et elle ne remplace aucune valeur de propriété définie manuellement. Ce sont les deux paramètres qui peuvent être passés dans la surcharge:

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