C# JsonSerializerSettings更改属性名称的大小写,但不更改属性名称';s属性

C# JsonSerializerSettings更改属性名称的大小写,但不更改属性名称';s属性,c#,json,jsonserializer,C#,Json,Jsonserializer,我正在为我的类属性使用以下设置 JsonSerializerSettings settings = new JsonSerializerSettings() { ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver() }; 对象中的某些属性属于其他类类型。我不想改变这些属性的情况 例如: 如何使用JsonSe

我正在为我的类属性使用以下设置

JsonSerializerSettings settings = new JsonSerializerSettings()
        {
            ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
        };
对象中的某些属性属于其他类类型。我不想改变这些属性的情况

例如:


如何使用JsonSerializerSettings实现这一点?

只需添加如下所示的JsonProperty属性,如果不想对整个对象树使用CamelCasePropertyNameContractResolver,请不要使用

public class CaseToChange
{
    [JsonProperty("stringProperty")]
    public string StringProperty { get; set; } //Change to camelCase

    [JsonProperty("otherTypeProperty")]
    public SomeOtherType OtherTypeProperty { get; set; } //Change name of this to camelCase but not property name of "SomeOtherType"
}

如果您可以修改要添加的类型,最简单的方法是添加到
CaseToChange
type:

[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]
public class CaseToChange
{
    public string StringProperty { get; set; } //Change to camelCase
    public SomeOtherType OtherTypeProperty { get; set; } //Change name of this to camelCase but not property name of "SomeOtherType"
}
(或者,如果您使用的Json.NET版本早于9.0.1,请向每个属性添加
[JsonProperty(“camelCaseName”)]
,如中所示。)

如果您无法修改类型,并且必须仅通过序列化程序设置对
CaseToChange
的属性进行大小写转换,则可以创建一个将
CaseToChange
的大小写转换为大小写的名称以及其他类型的未修改名称返回大小写转换的名称。下面是一个技巧:

public class OverrideContractResolver : ContractResolverDecorator
{
    readonly Dictionary<Type, IContractResolver> overrides;

    public OverrideContractResolver(IEnumerable<KeyValuePair<Type, IContractResolver>> overrides, IContractResolver baseResolver)
        : base(baseResolver)
    {
        if (overrides == null)
            throw new ArgumentNullException();
        this.overrides = overrides.ToDictionary(p => p.Key, p => p.Value);
    }

    public override JsonContract ResolveContract(Type type)
    {
        IContractResolver resolver;
        if (overrides.TryGetValue(type, out resolver))
            return resolver.ResolveContract(type);
        return base.ResolveContract(type);
    }
}

public class ContractResolverDecorator : IContractResolver
{
    readonly IContractResolver baseResolver;

    public ContractResolverDecorator(IContractResolver baseResolver)
    {
        if (baseResolver == null)
            throw new ArgumentNullException();
        this.baseResolver = baseResolver;
    }

    #region IContractResolver Members

    public virtual JsonContract ResolveContract(Type type)
    {
        return baseResolver.ResolveContract(type);
    }

    #endregion
}
样品


为了获得最佳性能,您可能需要。

JsonSerializerSettings
将默认设置应用于正在序列化的所有类型。如果您只想将
CaseToChange
的大小写更改为驼峰大小写,您可以对其进行应用。您需要将其置于设置中,还是可以修改类型?
public class OverrideContractResolver : ContractResolverDecorator
{
    readonly Dictionary<Type, IContractResolver> overrides;

    public OverrideContractResolver(IEnumerable<KeyValuePair<Type, IContractResolver>> overrides, IContractResolver baseResolver)
        : base(baseResolver)
    {
        if (overrides == null)
            throw new ArgumentNullException();
        this.overrides = overrides.ToDictionary(p => p.Key, p => p.Value);
    }

    public override JsonContract ResolveContract(Type type)
    {
        IContractResolver resolver;
        if (overrides.TryGetValue(type, out resolver))
            return resolver.ResolveContract(type);
        return base.ResolveContract(type);
    }
}

public class ContractResolverDecorator : IContractResolver
{
    readonly IContractResolver baseResolver;

    public ContractResolverDecorator(IContractResolver baseResolver)
    {
        if (baseResolver == null)
            throw new ArgumentNullException();
        this.baseResolver = baseResolver;
    }

    #region IContractResolver Members

    public virtual JsonContract ResolveContract(Type type)
    {
        return baseResolver.ResolveContract(type);
    }

    #endregion
}
var settings = new JsonSerializerSettings
{
    ContractResolver =
        new OverrideContractResolver(
            new Dictionary<Type, IContractResolver> { { typeof(CaseToChange), new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver() } },
            new Newtonsoft.Json.Serialization.DefaultContractResolver()),
};
{
  "stringProperty": "string property",
  "otherTypeProperty": {
    "FooProperty": "foo",
    "BarProperty": 101
  }
}