【问题标题】:Newtonsoft JsonConvert.SerializeObject use property name insted of [JsonProperty("")] [duplicate]Newtonsoft JsonConvert.SerializeObject 使用属性名称插入 [JsonProperty("")] [重复]
【发布时间】:2020-03-26 10:04:43
【问题描述】:

我的项目中有一个类需要针对两个不同的用例进行序列化。 因为我不能在属性上添加两个不同的属性,所以我想序列化类的对象 一次使用 [JsonProperty("attributname")] 声明,一次使用它自己的属性名称。

例如:

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"
        // }
    }
}

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

感谢您的帮助!

【问题讨论】:

标签: c# serialization json.net


【解决方案1】:

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

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"
    // }

【讨论】:

  • 感谢您的回答!我结合了你的答案,解决了我的问题。完美!
  • Good further Read,如果我的回答正确,请标记为正确,谢谢,我很高兴能为您提供帮助
  • @Munzer 我试过了,在第一级对象上工作了,但是嵌套对象还是一样的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多