ある時点でJSONにシリアル化されるクラスがたくさんあり、バックエンドのC#規則とフロントエンドのJavaScript規則の両方に従うために、次のようなプロパティを定義しています。
[JsonProperty(PropertyName="myFoo")]
public int MyFoo { get; set; }
そのため、C#では次のことができます。
MyFoo = 10;
そして、Javascriptでは次のことができます:
if (myFoo === 10)
しかし、すべてのプロパティに対してこれを行うのは退屈です。 JSON.Netがプロパティ名を処理するデフォルトの方法をすばやく簡単に設定する方法はありますか?そうしないと自動的にキャメルケースになりますか?
提供されているクラス Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver を使用できます。
var serializer = new JsonSerializer
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var jobj = JObject.FromObject(request, serializer);
つまり、カスタムリゾルバを自分で作成する必要はありません。
オブジェクトをシリアル化するとき、いくつかのカスタム設定を渡します。
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var json = JsonConvert.SerializeObject(yourObject, settings);
受け入れられた回答はリンクのみなので、実際に使用したコードを追加します(リンクが切れた場合)。リンクにあったものとほぼ同じです。
// Automatic camel casing because I'm bored of putting [JsonProperty] on everything
// See: http://harald-muehlhoff.de/post/2013/05/10/Automatic-camelCase-naming-with-JsonNET-and-Microsoft-Web-API.aspx#.Uv43fvldWCl
public 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 && attr.PropertyName != null)
res.PropertyName = attr.PropertyName;
}
return res;
}
}
私が行った唯一の変更は、attr.PropertyName != null
をif節に追加したのは、次のようなものを追加したためです。
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string SomeProperty { get; set; }
PropertyName
を指定したくありませんでした(したがって、nullです)。上記はJSONでsomeProperty
としてシリアル化されます。
新しい CamelCaseNamingStrategy
を使用することをお勧めします。
_new JsonSerializerSettings()
{
ContractResolver = new DefaultContractResolver
{
NamingStrategy = new CamelCaseNamingStrategy()
}
};
_
デフォルトでJsonPropert('Name')
によって設定されたカスタム名をオーバーライドしません。 (動作はCamelCaseNamingStrategy(bool, bool)
ctorで変更できます。)したがって、@ Matt Burlandの答えのようなカスタムクラスを作成する必要はありません。
カスタム 契約リゾルバー を使用できます。
class MyContractResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
var properties = base.CreateProperties(type, memberSerialization);
foreach (var property in properties)
{
property.PropertyName = char.ToLower(property.PropertyName[0]) + string.Join("", property.PropertyName.Skip(1));
}
return properties;
}
}
そして次のように使用します:
class MyClass
{
public int MyProperty { get; set; }
public int MyProperty2 { get; set; }
}
var json = JsonConvert.SerializeObject(new MyClass(),
Formatting.Indented,
new JsonSerializerSettings { ContractResolver = new MyContractResolver() });
JObject.FromObject
は、JsonConvert
defaultsのデフォルト設定を使用します。次のように割り当てることができるfuncプロパティがあります。
JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
そして、Jobject.FromObject
を呼び出すたびに、このfuncを使用して設定を作成します。