あなたがJson.NET serialization attributesを追加するために、あなたのタイプを変更することができた場合は、一番簡単な方法は、あなたのCaseToChange
タイプに[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]
を追加することです:
[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のバージョンを使用している場合9.0.1より前の.NETの場合、this answerのように各プロパティに[JsonProperty("camelCaseName")]
を追加してください。
タイプを変更できない場合は、CaseToChange
のプロパティをシリアライザsett CaseToChange
のキャメルケース名と他のタイプの変更されていない名前を返すcustom contract resolverを作成することができます。その後
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()),
};
をし、得られJSONは次のようになります。
{
"stringProperty": "string property",
"otherTypeProperty": {
"FooProperty": "foo",
"BarProperty": 101
}
}
サンプルfiddle次は、トリックを行います。
最適なパフォーマンスを得るには、cache instances of the contract resolverとします。
出典
2017-02-07 17:27:07
dbc
'JsonSerializerSettings'は、シリアル化されるすべての型にデフォルト設定を適用します。 'CaseToChange'のケーシングをキャメルケースに変更したいのであれば、[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]]を適用することができます(http://www.newtonsoft.com/json/help/html /P_Newtonsoft_Json_JsonContainerAttribute_NamingStrategyType.htm)を追加します。 – dbc
あなたは**設定が必要です**、またはタイプを変更できますか? – dbc