仅当在Json.Net中未显式设置PropertyName时使用CamelCase?

19

我正在为我的网站使用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);
}
< p > < code > Experiment 的输出是:

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

然而,我希望输出结果是:

{"normalProperty":null,"CustomName":null}

这个可行吗?


请不要使用CamelCasePropertyNamesContractResolver,仅使用JsonProperty - L.B
@L.B 如果我只使用JsonProperty,那么默认的命名将是PascalCase,所以normalProperty在JSON中会变成NormalProperty - Oliver
Oliver,它的序列化方式与JsonProperty中给出的完全相同。 - L.B
1
如果没有JsonProperty,在序列化时会被序列化为'NormalProperty'。如果我需要序列化一个有20个PascalCase属性的类,我不想为每个属性都编写一个JsonProperty来符合javascript命名约定,这是不必要的努力。 - Oliver
1
上述代码在我的电脑上能够正常运行,且未经过任何修改,使用的是 Newtonsoft.Json 的 7.0.1 版本,因此我认为这可能是一个已经被修复的错误。 - Big McLargeHuge
2个回答

21

你可以像这样重写 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;
    }
}

8
稍作修改 if (res.PropertyName != null && attr.PropertyName != null),这样就可以在没有名称的字段上设置JsonProperty属性,并且仍然可以使用常规驼峰式大小写处理。如果您只想设置类似于 [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 的内容,则非常有用。 - Matt Burland

2

随着NamingStrategy的引入,IT技术变得更加容易。
作为一个额外的好处,你可以让它不修改字典键。

class MyContractResolver : CamelCasePropertyNamesContractResolver
{
    public MyContractResolver()
    {
        NamingStrategy.OverrideSpecifiedNames = false;    //Overriden
        NamingStrategy.ProcessDictionaryKeys = false;     //Overriden
        NamingStrategy.ProcessExtensionDataNames = false; //default
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接