私は次のモデルを持っています:
public enum Status
{
[Display(Name = "Awaiting Approval")]
AwaitingApproval,
Rejected,
Accepted,
}
この列挙型を次のようなモデルで使用します。
public class Docs
{
[Key]
public int Id { get; set; }
[JsonConverter(typeof(StringEnumConverter))]
public Status Status { get; set; }
}
これでうまくいきます。シリアライザは列挙型に相当する文字列を返します。私の質問は、JSON.NETにDisplay
ではなくstring
属性を取得するように指示する方法です。
[EnumMember]
ではなく[Display]
を使用してみてください。列挙型自体に[JsonConverter]
属性を置くこともできます。
[JsonConverter(typeof(StringEnumConverter))]
public enum Status
{
[EnumMember(Value = "Awaiting Approval")]
AwaitingApproval,
Rejected,
Accepted,
}
WebAPIでの最良のオプションは、説明値を持つJSONのすべての列挙型文字列をグローバルに変換することです
モデルでは、この名前空間を使用しますusing Newtonsoft.Json.Converters;
public class Docs
{
[Key]
public int Id { get; set; }
[JsonConverter(typeof(StringEnumConverter))]
public Status Status { get; set; }
}
Enumでは、この名前空間を使用しますusing System.Runtime.Serialization;
for EnumMember
public enum Status
{
[EnumMember(Value = "Awaiting Approval")]
AwaitingApproval,
Rejected,
Accepted,
}
Global.asaxにこのコードを追加します
protected void Application_Start()
{
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter());
}
WebAPIを使用してJSONで列挙型を正常に返します。
私はこれを試し、エラーが発生しましたtype or namespace enum member could not be found...
したがって、皆さんもこのエラーを受け取る可能性があるため、使用する必要があります
using System.Runtime.Serialization;
それでもこのエラーが発生する場合は、以下のような参照を追加します。
Right click on your project -> Add -> Reference.. -> Assemblies -> Mark System.Runtime.Serialization (i have 4.0.0.0 version ) -> Ok
これで、次のように進めることができます:
[JsonConverter(typeof(StringEnumConverter))]
public enum Status
{
[EnumMember(Value = "Awaiting Approval")]
AwaitingApproval,
Rejected,
Accepted,
}