CamelCase只有在Json.Net中没有显式设置PropertyName时?

Oli*_*ver 19 c# 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);
}
Run Code Online (Sandbox Code Playgroud)

输出来自Experiment:

{"normalProperty":null,"customName":null}
Run Code Online (Sandbox Code Playgroud)

但是,我希望输出为:

{"normalProperty":null,"CustomName":null}
Run Code Online (Sandbox Code Playgroud)

这有可能实现吗?

Oli*_*ver 20

您可以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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 稍微改进一下`if(res.PropertyName!= null && attr.PropertyName!= null)`这样做可以让你在一个没有名字的字段上设置一个`JsonProperty`属性,并且仍然用普通的驼峰套管处理它.如果你想设置类似`[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]的东西,这很有用. (8认同)