С# 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; }
}
Ответы
Ответ 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;}
}