Question .NET - sérialisation JSON d'enum sous forme de chaîne


J'ai une classe qui contient un enum propriété, et sur la sérialisation de l'objet en utilisant JavaScriptSerializer, mon résultat json contient la valeur entière de l'énumération plutôt que son string "prénom". Y a-t-il un moyen d'obtenir l'enum comme string dans mon json sans avoir à créer une coutume JavaScriptConverter? Peut-être qu'il y a un attribut que je pourrais décorer le enum définition, ou propriété de l'objet, avec?

Par exemple:

enum Gender { Male, Female }

class Person
{
    int Age { get; set; }
    Gender Gender { get; set; }
}

Résultat json désiré:

{ "Age": 35, "Gender": "Male" }

852
2018-03-14 05:18


origine


Réponses:


Non, il n'y a pas d'attribut spécial que vous pouvez utiliser. JavaScriptSerializer sérialise enums à leurs valeurs numériques et non leur représentation sous forme de chaîne. Vous devez utiliser la sérialisation personnalisée pour sérialiser enum comme son nom au lieu de la valeur numérique.

Modifier: Comme indiqué par @OmerBakhari JSON.net couvre ce cas d'utilisation (via l'attribut [JsonConverter(typeof(StringEnumConverter))]) et beaucoup d'autres non traités par les sérialiseurs .net intégrés. Voici un lien comparant les fonctionnalités et fonctionnalités des sérialiseurs.


204
2018-03-14 06:21



J'ai trouvé ça Json.NET fournit la fonctionnalité exacte que je cherche avec un StringEnumConverter attribut:

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

[JsonConverter(typeof(StringEnumConverter))]
public Gender Gender { get; set; }

Plus de détails disponibles sur StringEnumConverter Documentation.


1656
2018-05-20 00:58



Ajoutez ci-dessous à votre global.asax pour la sérialisation JSON de c # enum sous forme de chaîne

  HttpConfiguration config = GlobalConfiguration.Configuration;
            config.Formatters.JsonFormatter.SerializerSettings.Formatting =
                Newtonsoft.Json.Formatting.Indented;

            config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                (new Newtonsoft.Json.Converters.StringEnumConverter());

150
2017-08-09 18:06



La réponse @Iggy définit la sérialisation JSON de c # enum en tant que chaîne uniquement pour ASP.NET (API Web et ainsi de suite).

Mais pour que cela fonctionne aussi avec une sérialisation ad hoc, ajoutez les suivantes à votre classe de démarrage (comme Global.asax Application_Start)

//convert Enums to Strings (instead of Integer) globally
JsonConvert.DefaultSettings = (() =>
{
    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new StringEnumConverter { CamelCaseText = true });
    return settings;
});

Plus d'information sur la page Json.NET

De plus, pour que votre membre enum puisse sérialiser / désérialiser vers / depuis un texte spécifique, utilisez le

System.Runtime.Serialization.EnumMember

attribut, comme ceci:

public enum time_zone_enum
{
    [EnumMember(Value = "Europe/London")] 
    EuropeLondon,

    [EnumMember(Value = "US/Alaska")] 
    USAlaska
}

99
2017-11-24 11:24



Ceci est facilement fait en ajoutant un ScriptIgnore attribuer à la Gender propriété, en provoquant la non-sérialisation, et en ajoutant GenderString propriété qui Est-ce que obtenir sérialisé:

class Person
{
    int Age { get; set; }

    [ScriptIgnore]
    Gender Gender { get; set; }

    string GenderString { get { return Gender.ToString(); } }
}

28
2018-03-15 17:38



Je n'ai pas été capable de changer le modèle source comme dans la meilleure réponse (de @ob.), Et je ne voulais pas l'enregistrer globalement comme @Iggy. Donc j'ai combiné https://stackoverflow.com/a/2870420/237091 et @ Iggy's https://stackoverflow.com/a/18152942/237091 pour activer le convertisseur de chaîne enum pendant la commande SerializeObject:

Newtonsoft.Json.JsonConvert.SerializeObject(
    objectToSerialize, 
    Newtonsoft.Json.Formatting.None, 
    new Newtonsoft.Json.JsonSerializerSettings()
    {
        Converters = new List<Newtonsoft.Json.JsonConverter> {
            new Newtonsoft.Json.Converters.StringEnumConverter()
        }
    })

27
2017-12-18 16:39



Cette version de Stephen répondre ne change pas le nom dans le JSON:

[DataContract(
    Namespace = 
       "http://schemas.datacontract.org/2004/07/Whatever")]
class Person
{
    [DataMember]
    int Age { get; set; }

    Gender Gender { get; set; }

    [DataMember(Name = "Gender")]
    string GenderString
    {
        get { return this.Gender.ToString(); }
        set 
        { 
            Gender g; 
            this.Gender = Enum.TryParse(value, true, out g) ? g : Gender.Male; 
        }
    }
}

26
2018-04-26 13:55



Voici la réponse pour newtonsoft.json

enum Gender { Male, Female }

class Person
{
    int Age { get; set; }

    [JsonConverter(typeof(StringEnumConverter))]
    Gender Gender { get; set; }
}

21
2018-04-21 09:47