JSON序列化中属性名称的默认camel案例
我有一堆类将在某些时候被序列化为JSON,为了遵循后端的C#约定和前端的JavaScript约定,我一直在定义这样的属性:
[JsonProperty(PropertyName="myFoo")] public int MyFoo { get; set; }
所以在C#中我可以:
MyFoo = 10;
在Javascript中,我可以:
if (myFoo === 10)
但是为每个房产做这件事都很乏味。 是否有一种快速简便的方法来设置JSON.Net处理属性名称的默认方式,因此除非另有说明,否则它将自动显示案例?
您可以使用提供的类Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver :
var serializer = new JsonSerializer { ContractResolver = new CamelCasePropertyNamesContractResolver() }; var jobj = JObject.FromObject(request, serializer);
换句话说,您不必自己创建自定义解析器。
序列化对象时,传入一些自定义设置。
var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; var json = JsonConvert.SerializeObject(yourObject, settings);
您可以使用自定义合约解析程序 :
class MyContractResolver : DefaultContractResolver { protected override IList CreateProperties(Type type, MemberSerialization memberSerialization) { var properties = base.CreateProperties(type, memberSerialization); foreach (var property in properties) { property.PropertyName = char.ToLower(property.PropertyName[0]) + string.Join("", property.PropertyName.Skip(1)); } return properties; } }
并使用它像:
class MyClass { public int MyProperty { get; set; } public int MyProperty2 { get; set; } } var json = JsonConvert.SerializeObject(new MyClass(), Formatting.Indented, new JsonSerializerSettings { ContractResolver = new MyContractResolver() });
由于接受的答案只是链接,我正在添加我最终使用的实际代码(如果链接死亡)。 它与链接中的内容基本相同:
// Automatic camel casing because I'm bored of putting [JsonProperty] on everything // See: https://harald-muehlhoff.de/post/2013/05/10/Automatic-camelCase-naming-with-JsonNET-and-Microsoft-Web-API.aspx#.Uv43fvldWCl public class CamelCase : CamelCasePropertyNamesContractResolver { protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { var res = base.CreateProperty(member, memberSerialization); var attrs = member.GetCustomAttributes(typeof(JsonPropertyAttribute), true); if (attrs.Any()) { var attr = (attrs[0] as JsonPropertyAttribute); if (res.PropertyName != null && attr.PropertyName != null) res.PropertyName = attr.PropertyName; } return res; } }
我做的唯一改变是在if子句中添加了attr.PropertyName != null
,因为我添加了类似的东西:
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)] public string SomeProperty { get; set; }
并且不想指定PropertyName
(因此它为null)。 以上将在JSON中序列化为someProperty
。
JObject.FromObject
使用JObject.FromObject
默认设置中的默认设置。 有一个func属性,您可以像这样分配:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() };
每当你调用Jobject.FromObject
,它都会使用这个func来构造设置。
最好使用新的CamelCaseNamingStrategy
:
new JsonSerializerSettings() { ContractResolver = new new DefaultContractResolver { NamingStrategy = new CamelCaseNamingStrategy() } };
默认情况下,它不会覆盖由JsonPropert('Name')
设置的自定义名称。 (你可以通过CamelCaseNamingStrategy(bool, bool)
改变行为。)因此,不需要像@Matt Burland那样创建自定义类。
上述就是C#学习教程:JSON序列化中属性名称的默认camel案例分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1011315.html