CamelCase только если свойствоName явно не указано в Json.Net?

Я использую Json.Net для своего сайта. Я хочу, чтобы сериализатор сериализовал имена свойств в camelcase по умолчанию. Я не хочу, чтобы он менял имена свойств, которые я вручную назначил. У меня есть следующий код:

public class TestClass
{
    public string NormalProperty { get; set; }

    [JsonProperty(PropertyName = "CustomName")]
    public string ConfiguredProperty { get; set; }
}

public void Experiment()
{
    var data = new TestClass { NormalProperty = null, 
        ConfiguredProperty = null };

    var result = JsonConvert.SerializeObject(data,
        Formatting.None,
        new JsonSerializerSettings {ContractResolver
            = new CamelCasePropertyNamesContractResolver()}
        );
    Console.Write(result);
}

Выход из Experiment:

{"normalProperty":null,"customName":null}

Однако, я хочу, чтобы результат был:

{"normalProperty":null,"customName":null}

Можно ли это достичь?

Ответы

Ответ 1

Вы можете переопределить класс CamelCasePropertyNamesContractResolver следующим образом:

class CamelCase : CamelCasePropertyNamesContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member,
        MemberSerialization memberSerialization)
    {
        var res = base.CreateProperty(member, memberSerialization);

        var attrs = member
            .GetCustomAttributes(typeof(JsonPropertyAttribute),true);
        if (attrs.Any())
        {
            var attr = (attrs[0] as JsonPropertyAttribute);
            if (res.PropertyName != null)
                res.PropertyName = attr.PropertyName;
        }

        return res;
    }
}