Соглашение C # JSON.NET, которое следует соглашениям именования свойств Ruby? - PullRequest
20 голосов
/ 13 октября 2010

Я использую http://json.codeplex.com/, и я разговариваю с API отдыха на основе Ruby. Проблема заключается в том, что большинство свойств имеют соглашение о присвоении имен. Мне интересно, если кто-нибудь знает способ, чтобы избежать необходимости добавлять много JsonProperty.

Например, я хочу избежать добавления атрибута 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; }
}

Ответы [ 4 ]

33 голосов
/ 15 октября 2010

Обновление - сентябрь 2016 года:

Json.NET 9.0.1 имеет SnakeCaseNamingStrategy .Вы можете использовать это, чтобы автоматически иметь свойства стиля twitter_screen_name.


Наследовать от DefaultContractResolver и переопределять ResolvePropertyName, чтобы форматировать имена свойств так, как вам хочется.аналогичное глобальное изменение имен свойств.

30 голосов
/ 01 сентября 2011

Читать это: 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(); 
        }
    }
10 голосов
/ 23 августа 2016

Начиная с версии 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);
4 голосов
/ 14 апреля 2016

Этот работал для меня

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

Использование функции Humanizer "Underscore"

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 class

public Class MyObjectType
{
    public string TestProperty {get;set;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...