【问题标题】:Can I customize Json.NET serialization without annotating my classes?我可以在不注释类的情况下自定义 Json.NET 序列化吗?
【发布时间】:2012-08-06 12:24:21
【问题描述】:

我需要使用 Json.NET 将一些实体类序列化为 JSON。为了自定义属性的名称,我像这样使用[JsonProperty] 属性:

    [JsonProperty("lastName")]
    public string LastName { get; set; }

问题是,我不想在我的实体中包含任何与 JSON 相关的属性...有没有办法以某种方式将注释外部化,以免它们弄乱我的实体?

使用XmlSerializer,可以通过XmlAttributeOverrides 类轻松完成。 Json.NET 有类似的东西吗?

【问题讨论】:

    标签: .net json serialization json.net


    【解决方案1】:

    是的,您可以创建自定义合同解析器并自定义 JsonProperty 定义,而无需使用属性。示例如下:

    class Person { public string First { get; set; } }
    
    class PersonContractResolver : DefaultContractResolver
    {
        protected override JsonProperty CreateProperty(
            MemberInfo member, 
            MemberSerialization memberSerialization)
        {
            var property = base.CreateProperty(member, memberSerialization);
    
            if (member.DeclaringType == typeof(Person) && member.Name == "First")
            {
                property.PropertyName = "FirstName";
            }
    
            return property;
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            var result = JsonConvert.SerializeObject(
                new Person { First = "John" },
                new JsonSerializerSettings 
                { 
                    ContractResolver = new PersonContractResolver() 
                });
    
            Console.WriteLine(result);
        }
    }
    

    此示例程序的输出如下:

    // {"FirstName":"John"}
    

    【讨论】:

    • 谢谢,这看起来是个不错的解决方案。不过,我可能会尝试使其更通用...
    • 我最终采取了不同的方式(我创建了特定的类,而不是将实体直接序列化为 JSON),但下次我会记住您的解决方案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2018-06-20
    相关资源
    最近更新 更多