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

时间:2012-08-09 09:47:13

标签: .net json serialization json.net

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

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

问题是,我不希望在我的实体中有任何与JSON相关的属性......是否有办法以某种方式外化注释,以便它们不会使我的实体混乱?

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

1 个答案:

答案 0 :(得分:6)

是的,您可以创建自定义合约解析程序并自定义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"}