c# - 有没有办法让 JSON.net 尊重 System.Text.Json JsonPropertyName 属性
问题描述
我有一个表示反序列化 C# 有效负载的 C# 类型。但它由 System.Text.Json 在一个地方反序列化。在另一个地方,它是 Json.NET。
所以现在,我必须同时使用[JsonProperty]
(对于 JSON.NET)和[JsonPropertyName]
(对于 System.Text.Json)来赋予属性。
有没有办法告诉 JSON.NET 识别 JsonPropertyName 属性,这样我就不必对每个属性进行两次注释?
解决方案
您可以创建自定义合同解析器,它将从中搜索JsonPropertyName
属性和使用值。示例一看起来像这样:
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# - Xamarin C# 无法将 c# 类转换为 Android.content.context
- asp.net - 如何在 Web API 中执行 Action Method 之前调用特定函数?
- java - 替换字符串中的值特定键
- ios - Collection-view 中的多个 Tableviews
- c# - 使用 ViewModel MVC 填充 DropdownlistFor
- ssl - 使用 Nginx 的 SSL 直通
- html - 内容脚本匹配
- r - 从列中查找全年每一天的最大数字,并在 R 中创建一个直到该数字的图
- macos-sierra - Mac OS Sierra 日志显示缺少 SSH 源 IP
- php - OVH的PHPmailer smtp错误,设置正确并在邮件应用程序中工作