首页 > 解决方案 > 有没有办法让 JSON.net 尊重 System.Text.Json JsonPropertyName 属性

问题描述

我有一个表示反序列化 C# 有效负载的 C# 类型。但它由 System.Text.Json 在一个地方反序列化。在另一个地方,它是 Json.NET。

所以现在,我必须同时使用[JsonProperty](对于 JSON.NET)和[JsonPropertyName](对于 System.Text.Json)来赋予属性。

有没有办法告诉 JSON.NET 识别 JsonPropertyName 属性,这样我就不必对每个属性进行两次注释?

标签: c#json.netjson.netsystem.text.json

解决方案


您可以创建自定义合同解析器,它将从中搜索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

推荐阅读