C# JSON序列化中属性名称的默认驼峰大小写
我有一堆类将在某个时候序列化为JSON,为了遵循后端的C#约定和前端的JavaScript约定,我定义了如下属性:C# JSON序列化中属性名称的默认驼峰大小写,c#,json,json.net,camelcasing,C#,Json,Json.net,Camelcasing,我有一堆类将在某个时候序列化为JSON,为了遵循后端的C#约定和前端的JavaScript约定,我定义了如下属性: [JsonProperty(PropertyName="myFoo")] public int MyFoo { get; set; } JsonConvert.DefaultSettings = () => new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesCon
[JsonProperty(PropertyName="myFoo")]
public int MyFoo { get; set; }
JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
因此,在C#中,我可以:
在Javascript中,我可以:
if (myFoo === 10)
但对每一处房产这样做都是乏味的。是否有一种快速简便的方法来设置JSON.Net处理属性名称的默认方式,以便在没有其他说明的情况下自动处理大小写?您可以使用自定义:
因为接受的答案是linkonly,所以我添加了我最终使用的实际代码(以防链接失效)。这与链接中的内容基本相同:
// 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;
}
}
我所做的唯一更改是添加了attr.PropertyName!=null
添加到if子句中,因为我添加了如下内容:
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string SomeProperty { get; set; }
并且不想指定
属性名称
(因此为空)。上述内容将在JSON中序列化为someProperty
,您可以使用提供的类:
换句话说,您不必自己创建自定义解析程序。序列化对象时,传入一些自定义设置
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var json = JsonConvert.SerializeObject(yourObject, settings);
JObject.FromObject
使用JsonConvert
默认设置。
有一个func属性,您可以这样指定:
[JsonProperty(PropertyName="myFoo")]
public int MyFoo { get; set; }
JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
无论何时调用Jobject.FromObject
,它都将使用此函数构造设置。最好使用新的(因为):
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var json = JsonConvert.SerializeObject(yourObject, settings);
默认情况下,它不会覆盖由
JsonPropert('Name')
设置的自定义名称。(您可以通过CamelCaseNamingStrategy(bool,bool)
ctor来更改行为。)因此,不需要像@Matt Burland的答案那样创建自定义类。CamelCasePropertyNamesContractResolver
实际上已经存在很长时间了。它至少早在2011年4月21日就出现了。如果你注意到,OP的解析器甚至继承了它。我想你指的是问这个问题的人。那里没有提到这件事。不过,这很好。是否可以将解析器指定为类的属性?不确定这与@DaveKennedy的答案有多大区别。请看这两个区别。a) JsonSerializer
vsJsonSerializerSettings
然后b)JsonConvert.XX
vsJObject.XX
。问题的关键是CamelCasePropertyNamesContractResolver
,其他一切都是次要的。查看哪里可以使用ContractResolver仍然很有用。Expand object有助于解析将Pascalcase转换为CamelCase您是否碰巧知道哪一个是包含CamelCaseNamingStrategy的第一个Newtonsoft.Json版本?@vezenkov,根据changelog。
public static JsonSerializer FormattingData()
{
var jsonSerializersettings = new JsonSerializer {
ContractResolver = new CamelCasePropertyNamesContractResolver() };
return jsonSerializersettings;
}
public static JObject CamelCaseData(JObject jObject)
{
var expandoConverter = new ExpandoObjectConverter();
dynamic camelCaseData =
JsonConvert.DeserializeObject(jObject.ToString(),
expandoConverter);
return JObject.FromObject(camelCaseData, FormattingData());
}
new JsonSerializerSettings()
{
ContractResolver = new DefaultContractResolver
{
NamingStrategy = new CamelCaseNamingStrategy()
}
};
public static JsonSerializer FormattingData()
{
var jsonSerializersettings = new JsonSerializer {
ContractResolver = new CamelCasePropertyNamesContractResolver() };
return jsonSerializersettings;
}
public static JObject CamelCaseData(JObject jObject)
{
var expandoConverter = new ExpandoObjectConverter();
dynamic camelCaseData =
JsonConvert.DeserializeObject(jObject.ToString(),
expandoConverter);
return JObject.FromObject(camelCaseData, FormattingData());
}