遵循Ruby属性命名约定的C#JSON.NET约定?
我正在使用https://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; } }
更新 – 2016年9月:
Json.NET 9.0.1有SnakeCaseNamingStrategy 。 您可以使用它自动拥有twitter_screen_name样式属性。
从DefaultContractResolver
inheritance并覆盖ResolvePropertyName
以根据需要格式化属性名称。
CamelCasePropertyNamesContractResolver
对属性名称进行类似的全局更改。
阅读本文: 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, @"([AZ])([AZ][az])|([a-z0-9])([AZ])", "$1$3_$2$4").ToLower(); } }
从版本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);
这个对我有用
var settings = new JsonSerializerSettings { ContractResolver = new PascalCaseToUnderscoreContractResolver() }; var rawJson = "{ test_property:'test' }" var myObject = JsonConvert.DeserializeObject(rawJson, settings);
使用Humanizerfunction“Underscore”
https://www.nuget.org/packages/Humanizer/1.37.7
https://humanizr.net/#underscore
上述就是C#学习教程:遵循Ruby属性命名约定的C#JSON.NET约定?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
public class PascalCaseToUnderscoreContractResolver : DefaultContractResolver { protected override string ResolvePropertyName(string propertyName) => propertyName.Underscore(); }
MyObjectType类
public Class MyObjectType { public string TestProperty {get;set;} }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1269686.html