.net - 我可以在不注释类的情况下自定义Json.NET序列化吗?

标签 .net json serialization json.net

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

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

问题是,我不想在我的实体中没有任何与JSON相关的属性...是否可以通过某种方式外部化注释,以免它们使我的实体困惑?

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

最佳答案

是的,您可以创建自定义契约(Contract)解析器并自定义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"}

关于.net - 我可以在不注释类的情况下自定义Json.NET序列化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11880677/

相关文章:

c# - 将 JSON 对象反序列化为 .NET HashSet

c# - XmlDocument.LoadXml() 抛出 ComException 类型的异常

ruby-on-rails - 从 JSON 访问虚拟属性

javascript - AngularJS:从 php 脚本获取 JSON

javascript - 如何使用本地存储中的详细信息成功登录 [JavaScript]

c#:使第 3 方对象可序列化

c# - 如何使用 mongo C# 驱动程序反序列化派生类数组的特定属性。无法创建抽象类的实例

c# - .NET 中两个字符串的逐字差异比较

c# - 对象完成但尚未收集垃圾时的弱引用行为

java - 从字符串反序列化 Java 二叉树