我有一堆类将在某些时候被序列化为JSON,为了遵循后端的C#约定和前端的JavaScript约定,我一直在定义这样的属性:
[JsonProperty(PropertyName="myFoo")]
public int MyFoo { get; set; }
所以在C#中我可以:
MyFoo = 10;
在Javascript中我可以:
if (myFoo === 10)
但是为每件房产做这件事都很乏味。是否有一种快速简便的方法来设置JSON.Net处理属性名称的默认方式,因此除非另有说明,否则它会自动出现?
答案 0 :(得分:34)
您可以使用提供的课程Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver:
var serializer = new JsonSerializer
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var jobj = JObject.FromObject(request, serializer);
换句话说,您不必自己创建自定义解析器。
答案 1 :(得分:12)
序列化对象时,请传入一些自定义设置。
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var json = JsonConvert.SerializeObject(yourObject, settings);
答案 2 :(得分:5)
您可以使用自定义contract resolver:
class MyContractResolver : DefaultContractResolver
{
protected override IList<JsonProperty> 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() });
答案 3 :(得分:5)
由于接受的答案仅限链接,因此我添加了最终使用的实际代码(如果链接死亡)。它与链接中的内容基本相同:
// 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
(所以它为空)。以上内容将以JSON序列化为someProperty
。
答案 4 :(得分:4)
JObject.FromObject
使用JsonConvert
默认设置中的默认设置。
有一个func属性,你可以像这样分配:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
每当你致电Jobject.FromObject
时,它都会使用此功能来构建设置。
答案 5 :(得分:4)
最好使用新的CamelCaseNamingStrategy
:
new JsonSerializerSettings()
{
ContractResolver = new DefaultContractResolver
{
NamingStrategy = new CamelCaseNamingStrategy()
}
};
默认情况下,它不会覆盖JsonPropert('Name')
设置的自定义名称。 (您可以通过CamelCaseNamingStrategy(bool, bool)
ctor更改行为。)因此,不需要创建自定义类,如@Matt Burland的答案。
答案 6 :(得分:1)
在 .NET 5.0 中,您可以使用 System.Text.Json 并在 JsonSerializerOptions 中指定 ProperyNamingPolicy
<块引用>System.Text.Json.JsonSerializerOptions.PropertyNamingPolicy
Here's 指向 Microsoft 文档页面的链接,该页面将属性设置为使用驼峰式大小写。
var serializeOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, serializeOptions);
类
public class WeatherForecastWithPropertyNameAttribute
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
[JsonPropertyName("Wind")]
public int WindSpeed { get; set; }
}
JSON 输出
{
"date": "2019-08-01T00:00:00-07:00",
"temperatureCelsius": 25,
"summary": "Hot",
"Wind": 35
}
答案 7 :(得分:-1)
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());
}