web-dev-qa-db-ja.com

JSONシリアル化のプロパティ名のデフォルトのキャメルケース

ある時点でJSONにシリアル化されるクラスがたくさんあり、バックエンドのC#規則とフロントエンドのJavaScript規則の両方に従うために、次のようなプロパティを定義しています。

[JsonProperty(PropertyName="myFoo")]
public int MyFoo { get; set; }

そのため、C#では次のことができます。

MyFoo = 10;

そして、Javascriptでは次のことができます:

if (myFoo === 10)

しかし、すべてのプロパティに対してこれを行うのは退屈です。 JSON.Netがプロパティ名を処理するデフォルトの方法をすばやく簡単に設定する方法はありますか?そうしないと自動的にキャメルケースになりますか?

28
Matt Burland

提供されているクラス Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver を使用できます。

var serializer = new JsonSerializer
{
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var jobj = JObject.FromObject(request, serializer);

つまり、カスタムリゾルバを自分で作成する必要はありません。

35
David Kennedy

オブジェクトをシリアル化するとき、いくつかのカスタム設定を渡します。

var settings = new JsonSerializerSettings
{
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};

var json = JsonConvert.SerializeObject(yourObject, settings);
13
Pure.Krome

受け入れられた回答はリンクのみなので、実際に使用したコードを追加します(リンクが切れた場合)。リンクにあったものとほぼ同じです。

// 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としてシリアル化されます。

6
Matt Burland

新しい CamelCaseNamingStrategy を使用することをお勧めします。

_new JsonSerializerSettings()
{
    ContractResolver = new DefaultContractResolver
    {
       NamingStrategy = new CamelCaseNamingStrategy()
    }
};
_

デフォルトでJsonPropert('Name')によって設定されたカスタム名をオーバーライドしません。 (動作はCamelCaseNamingStrategy(bool, bool) ctorで変更できます。)したがって、@ Matt Burlandの答えのようなカスタムクラスを作成する必要はありません。

5
xmedeko

カスタム 契約リゾルバー を使用できます。

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() });
5
Alberto

JObject.FromObjectは、JsonConvert defaultsのデフォルト設定を使用します。次のように割り当てることができるfuncプロパティがあります。

 JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
 {
   ContractResolver = new CamelCasePropertyNamesContractResolver()
 };

そして、Jobject.FromObjectを呼び出すたびに、このfuncを使用して設定を作成します。