2011-10-17 21 views
18

estoy usando JSON.net (¿quizás v3.5ish? Es de octubre de 2010). y yo estoy tratando de deserializar algunos JSON en una enumeración:analizando una enumeración en JSON.net

GeometryType: "esriGeometryPolygon"

tengo esta enumeración:

/// <summary> 
/// The geometry type. 
/// </summary> 
[DataContract] 
public enum GeometryType 
{ 
    /// <summary> 
    /// Refers to geometry type Envelope 
    /// </summary> 
    [EnumMember(Value = "esriGeometryEnvelope")] 
    Envelope, 
    /// <summary> 
    /// Refers to geometry type MultiPoint 
    /// </summary> 
    [EnumMember(Value = "esriGeometryMultipoint")] 
    MultiPoint, 
    /// <summary> 
    /// Refers to geometry type MapPoint 
    /// </summary> 
    [EnumMember(Value = "esriGeometryPoint")] 
    Point, 
    /// <summary> 
    /// Refers to geometry type Polygon 
    /// </summary> 
    [EnumMember(Value = "esriGeometryPolygon")] 
    Polygon, 
    /// <summary> 
    /// Refers to geometry type Polyline 
    /// </summary> 
    [EnumMember(Value = "esriGeometryPolyline")] 
    Polyline 
} 

pero arroja un error que dice "Error al convertir el valor" esriGeometryPolygon "escribir '... GeometryType'.

lo que me estoy perdiendo aquí?

es porque es una versión antigua (estoy usando el mon puerto otouch: https://github.com/chrisntr/Newtonsoft.Json que no se ha actualizado en un año)? ¿O me equivoqué con mi contrato de datos?


EDITAR: he portado el último JSON.NET a MT y sigo recibiendo exactamente el mismo error.

+0

¿Alguna diferencia si cambia el nombre de los valores de Enum en C# para que coincida exactamente con el JSON? (En lugar de tratar de usar el atributo EnumMember) – jonathanpeppers

+0

Jonathan, parece que sí. –

Respuesta

37

Según la documentación JSON.NET, el comportamiento por defecto es usar el valor int para enumeraciones: http://james.newtonking.com/projects/json/help/SerializationGuide.html

Puede cambiar eso mediante la adición de un atributo con JsonConverter StringEnumConverter en su enumeración ...

/// <summary> 
/// The geometry type. 
/// </summary> 
[DataContract] 
[JsonConverter(typeof(StringEnumConverter))] 
public enum GeometryType 

Documentación: Serialize with JsonConverters

+1

Bingo. Esto debe marcarse como la respuesta correcta. – HolySamosa

+6

Alternativamente, si desea evitar el acoplamiento entre DTO y Json.Net, puede agregar el convertidor al nivel de serializador: serializador var = nuevo JsonSerializer(); serializer.Converters.Add (new StringEnumConverter()); – Mose