2011-10-17 9 views
18

私はJSON.netを使用しています(おそらくv3.5ish?それは2010年10月からです)。そして私は、列挙の中にいくつかのJSONをデシリアライズしようとしている:JSON.netで列挙を解析する

geometryType: "esriGeometryPolygon"

iはこの列挙持っている:

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

をしかし、それはesriGeometryPolygonを "変換エラー値を" というエラーがスローされます"と入力するには『... GeometryType』を。

を私がここで行方不明です何?

がそれをあるそれは古いバージョンだから(私は月を使用していますotouchポート:https://github.com/chrisntr/Newtonsoft.Json年は更新されていません)?または私は間違って私のdatacontractを得たか?


EDIT:私は最新のJSON.NETをMTに移植しましたが、私はまったく同じエラーを受けています。

+0

JSONと正確に一致するようにC#でEnum値の名前を変更すると、違いはありますか? (EnumMember属性を使用しようとする代わりに) – jonathanpeppers

+0

Jonathan、それはそうです。 –

答えて

37

JSON.NETのドキュメントによると、デフォルトの動作は、列挙型のint値を使用することです:http://james.newtonking.com/projects/json/help/SerializationGuide.html

あなたの列挙型にStringEnumConverterでJsonConverter属性を追加することであることを変更することができます...

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

ドキュメント:Serialize with JsonConverters

+1

ビンゴ。これには正解とフラグを立てる必要があります。 – HolySamosa

+6

また、DTOとJson.Netの結合を避けたい場合は、コンバータをシリアライザレベルで追加できます。 var serializer = new JsonSerializer(); serializer.Converters.Add(new StringEnumConverter()); – Mose

関連する問題