2011-10-17 29 views
18

Tôi đang sử dụng JSON.net (có thể là v3.5ish? Từ tháng 10 năm 2010). và tôi đang cố gắng để deserialize một số json thành một liệt kê:phân tích cú pháp một liệt kê trong JSON.net

GeometryType: "esriGeometryPolygon"

tôi có liệt kê này:

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

nhưng nó ném một lỗi nói rằng "Lỗi chuyển đổi giá trị" esriGeometryPolygon "gõ '... GeometryType'.

gì am i thiếu ở đây?

là nó vì nó là một phiên bản cũ (tôi đang sử dụng các mon otouch port: https://github.com/chrisntr/Newtonsoft.Json chưa được cập nhật trong một năm)? hoặc tôi có được datacontract của tôi sai?


EDIT: tôi đã chuyển JSON.NET mới nhất sang MT và tôi vẫn gặp lỗi chính xác.

+0

Bất kỳ sự khác biệt nào nếu bạn đổi tên các giá trị Enum của mình trong C# để khớp chính xác với JSON? (Thay vì cố gắng sử dụng thuộc tính EnumMember) – jonathanpeppers

+0

Jonathan, có vẻ như, vâng. –

Trả lời

37

Theo tài liệu JSON.NET, hành vi mặc định là sử dụng giá trị int cho Enums: http://james.newtonking.com/projects/json/help/SerializationGuide.html

Bạn có thể thay đổi điều đó bằng cách thêm thuộc tính với StringEnumConverter một JsonConverter trên enum của bạn ...

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

Tài liệu: Serialize with JsonConverters

+1

Bingo. Điều này sẽ được gắn cờ là câu trả lời chính xác. – HolySamosa

+6

Ngoài ra, nếu bạn muốn tránh ghép nối giữa DTO và Json.Net, bạn có thể thêm bộ chuyển đổi ở mức serializer: var serializer = new JsonSerializer(); serializer.Converters.Add (StringEnumConverter mới()); – Mose

Các vấn đề liên quan