6

この質問で最も投票された回答の下にあるディエゴの未回答のコメントに基づいています。

列挙型の文字列としての JSON シリアル化

したがって、列挙型の場合:

public enum ContactType
{
    Phone = 0,
    Email = 1,
    Mobile = 2
}

そして例えば。プロパティ:

//could contain ContactType.Phone, ContactType.Email, ContactType.Mobile
IEnumerable<ContactType> AvailableContactTypes {get;set;} 

JSONのようなものに:

{ContactTypes : ['Phone','Email','Mobile']}

それ以外の

{ContactTypes : [0,1,2]}

通常の JavaScriptSerializer と同じように?

4

2 に答える 2

3

Json.NET の新しいバージョンの 1 つでItemConverterType、属性のプロパティを介して適切な準備ができているように見えJsonPropertyます。

http://james.newtonking.com/archive/2012/05/08/json-net-4-5-release-5-jsonproperty-enhancements.aspx

自分のプロジェクトに関連する Json.NET 3.5 からのアップグレードで問題が発生したため、試すことができませんでした。最後に、ビューモデルをIEnumerable<string>Shmiddty の提案に従って変換しました (インピーダンスの不一致はまだありますが、将来これをリファクタリングするために戻ってきます)。

同じ問題を抱えている他の人に役立つことを願っています!

使用例:

[JsonProperty(ItemConverterType = typeof(StringEnumConverter))]
IEnumerable<ContactType> AvailableContactTypes {get;set;} 
于 2013-02-20T11:21:08.960 に答える
2

これらの場合、json.netパーサーの動作を変更するよりも、プロパティを追加する方が簡単であることが常にわかりました。

[JsonIgnore]
IEnumerable<ContactType> AvailableContactTypes {get;set;}

IEnumerable<string> AvailableContactTypesString
{
    get { return AvailableContactTypes.Select(c => c.ToString()); }
}

もちろん、逆シリアル化する必要がある場合は、そのプロパティにもセッターが必要です。

set { AvailableContactTypes = value
    .Select(c => Enum.Parse(typeof(ContactType), c) as ContactType); }
于 2013-02-19T18:23:59.860 に答える