2011-10-17 13 views
18

sto usando JSON.net (forse v3.5ish? È dell'ottobre 2010). e sto cercando di deserializzare alcuni JSON in un'enumerazione:analizzando un'enumerazione in JSON.net

GeometryType: "esriGeometryPolygon"

ho questa enumerazione:

/// <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 
} 

ma genera un errore che dice "Errore valore di conversione" esriGeometryPolygon "per digitare '... GeometryType'.

che cosa mi manca qui?

è perché è una vecchia versione (sto usando il mon porta otouch: https://github.com/chrisntr/Newtonsoft.Json che non è stato aggiornato in un anno)? o ho sbagliato il mio contratto con i dati?


EDIT: ho portato l'ultimo JSON.NET su MT e sto ancora ottenendo lo stesso errore.

+0

Qualsiasi differenza se si rinomina il proprio valore Enum in C# in modo che corrisponda esattamente al JSON? (Invece di provare ad usare l'attributo EnumMember) – jonathanpeppers

+0

Jonathan, sembra, sì. –

risposta

37

Secondo la documentazione JSON.NET, comportamento predefinito è quello di utilizzare il valore int per enumerazioni: http://james.newtonking.com/projects/json/help/SerializationGuide.html

È possibile cambiare la situazione con l'aggiunta di un attributo JsonConverter con StringEnumConverter sul tuo enum ...

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

Documentazione: Serialize with JsonConverters

+1

Bingo. Questo dovrebbe essere contrassegnato come la risposta corretta. – HolySamosa

+6

In alternativa, se si desidera evitare l'accoppiamento tra DTO e Json.Net, è possibile aggiungere il convertitore a livello di serializzatore: var serializer = new JsonSerializer(); serializer.Converters.Add (new StringEnumConverter()); – Mose