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: http://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那样创建自定义类。