web-dev-qa-db-ja.com

JSON.NET StringEnumConverterにDisplayNameを取るように指示するにはどうすればよいですか?

私は次のモデルを持っています:

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属性を取得するように指示する方法です。

20
Irshu

[EnumMember]ではなく[Display]を使用してみてください。列挙型自体に[JsonConverter]属性を置くこともできます。

[JsonConverter(typeof(StringEnumConverter))]
public enum Status
{
    [EnumMember(Value = "Awaiting Approval")]
    AwaitingApproval,
    Rejected,
    Accepted,
}
40
nsgocev

WebAPIでの最良のオプションは、説明値を持つJSONのすべての列挙型文字列をグローバルに変換することです

  1. モデルでは、この名前空間を使用しますusing Newtonsoft.Json.Converters;

    public class Docs
    {
    [Key]
    public int Id { get; set; }
    [JsonConverter(typeof(StringEnumConverter))]
    public Status Status { get; set; }
    }
    
  2. Enumでは、この名前空間を使用しますusing System.Runtime.Serialization; for EnumMember

    public enum Status
    {
    [EnumMember(Value = "Awaiting Approval")]
    AwaitingApproval,
    Rejected,
    Accepted,
    }
    
  3. Global.asaxにこのコードを追加します

        protected void Application_Start()
        {
          GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter());
    
        }
    

WebAPIを使用してJSONで列挙型を正常に返します。

4
adnan

私はこれを試し、エラーが発生しました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,
}
0
Divya Agrawal