有没有办法让 JSON.net 遵守 System.Text.Json JsonPropertyName 属性
Is there a way to have JSON.net honor the System.Text.Json JsonPropertyName attribute
我有一个代表反序列化 C# 负载的 C# 类型。但是它被 System.Text.Json 在一个地方反序列化了。在另一个地方,它是 Json.NET.
所以现在,我必须同时使用 [JsonProperty]
(对于 JSON.NET)和 [JsonPropertyName]
(对于 System.Text.Json)来归因属性。
有没有办法告诉 JSON.NET 识别 JsonPropertyName 属性,这样我就不必对每个 属性 注释两次?
您可以创建 custom contract resolver,它将搜索 JsonPropertyName
属性并使用其中的值。示例 1 看起来像这样:
public class ContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
if (member.GetCustomAttribute<JsonPropertyNameAttribute>() is {} stj)
{
property.PropertyName = stj.Name;
return property;
}
return property;
}
}
和用法:
class MyClass
{
[JsonProperty("P1")]
public int MyProperty { get; set; }
[JsonPropertyName("P2")]
public int MyProperty2 { get; set; }
}
var settings = new JsonSerializerSettings
{
ContractResolver = new ContractResolver()
};
Console.WriteLine(JsonConvert.SerializeObject(new MyClass(), settings)); // prints {"P1":0,"P2":0}
Console.WriteLine(JsonConvert.DeserializeObject<MyClass>("{'P1':1,'P2':2}", settings).MyProperty2); // prints 2
我有一个代表反序列化 C# 负载的 C# 类型。但是它被 System.Text.Json 在一个地方反序列化了。在另一个地方,它是 Json.NET.
所以现在,我必须同时使用 [JsonProperty]
(对于 JSON.NET)和 [JsonPropertyName]
(对于 System.Text.Json)来归因属性。
有没有办法告诉 JSON.NET 识别 JsonPropertyName 属性,这样我就不必对每个 属性 注释两次?
您可以创建 custom contract resolver,它将搜索 JsonPropertyName
属性并使用其中的值。示例 1 看起来像这样:
public class ContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
if (member.GetCustomAttribute<JsonPropertyNameAttribute>() is {} stj)
{
property.PropertyName = stj.Name;
return property;
}
return property;
}
}
和用法:
class MyClass
{
[JsonProperty("P1")]
public int MyProperty { get; set; }
[JsonPropertyName("P2")]
public int MyProperty2 { get; set; }
}
var settings = new JsonSerializerSettings
{
ContractResolver = new ContractResolver()
};
Console.WriteLine(JsonConvert.SerializeObject(new MyClass(), settings)); // prints {"P1":0,"P2":0}
Console.WriteLine(JsonConvert.DeserializeObject<MyClass>("{'P1':1,'P2':2}", settings).MyProperty2); // prints 2