首页 > 解决方案 > Newtonsoft JsonConvert.SerializeObject 使用属性名称 insted [JsonProperty("")]

问题描述

我的项目中有一个类,需要针对两个不同的用例进行序列化。由于我无法在属性上添加两个不同的属性,因此我想使用 [JsonProperty("attributname")] decleration 一次序列化该类的对象,并使用其自身的属性名称序列化一次。

例如:

public class Contact
{
    [JsonProperty("name")]
    public string Lastname { get; set; }
}

public class Program
{
    public void SerializeByJsonPropertyName()
    {
        var contact = new Contact()
        {
            Lastname = "Harber"
        }
        var requestJson = JsonConvert.SerializeObject(contact);
        // Serialized Object requestJson:
        // {
        //     "name" = "Harber"
        // }
    }

    public void SerializeByPropertyName()
    {
        var contact = new Contact()
        {
            Lastname = "Harber"
        }
        var requestJson = JsonConvert.SerializeObject(contact /*, ? Setting ?*/);
        // Serialized Object requestJson:
        // {
        //     "Lastname" = "Harber"
        // }
    }
}

第一个 szenario 工作得很好,但对于第二个 szenario 我找不到任何解决方案。除了创建两个类或在我的类中复制属性.. Newtonsofts JsonConverter 中是否有任何设置可以做到这一点?

谢谢你的帮助!

标签: c#serializationjson.net

解决方案


你可以创建不同的命名策略,然后创建不同的设置,每个设置都有一个合约解析器,每个合约解析器都有一个命名策略,然后你为每个设置提供你想要使用的命名策略,像这样

public static class JsonSerializingSettings {

    public static JsonSerializerSettings JsonUnModified{ get; set; } = new JsonSerializerSettings
    {
        ContractResolver = new DefaultContractResolver() {
            NamingStrategy =  new UnmodifiedNamingStrategy()
        }
    };
    public static JsonSerializerSettings JsonDefault { get; set; } = new JsonSerializerSettings
    {
        ContractResolver = new DefaultContractResolver() {
            NamingStrategy =  new DefaultNamingStrategy()
        }
    };
 }
public class UnmodifiedNamingStrategy : NamingStrategy {


    protected override string ResolvePropertyName(string name) {
        return name;
    }

}

当你想使用它时

    var requestJson = JsonConvert.SerializeObject(contact,JsonSerializingSettings.JsonDefault);
    // Serialized Object requestJson:
    // {
    //     "name" = "Harber"
    // }

var requestJson = JsonConvert.SerializeObject(contact,JsonSerializingSettings.JsonUnModified);
    // Serialized Object requestJson:
    // {
    //     "Lastname" = "Harber"
    // }

推荐阅读