Подтвердить что ты не робот

С# JSON.NET, которая следует за соглашениями об именах Ruby?

Я использую http://json.codeplex.com/, и я говорю с Ruby на основе Rest 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; }
}
4b9b3361

Ответ 1

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

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


Наследовать от DefaultContractResolver и переопределить ResolvePropertyName для форматирования имен свойств по своему усмотрению.

CamelCasePropertyNamesContractResolver выполняет аналогичное глобальное изменение имен свойств.

Ответ 2

Прочтите это: 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(); 
        }
    }

Ответ 3

Начиная с версии 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

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

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

Использование функции Гуманизатора "Подчеркивание"

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

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