2012-02-12 24 views
2

當試圖從反序列化JSON字符串返回Header option類型的記錄員,我得到下面的異常:反序列化選項<'a>

數據合同類型 「Microsoft.FSharp.Core.FSharpOption`1 [ [MyWeb.Controllers.Header, MyWeb.Controllers,Version = 0.0.0.0,Culture = neutral, PublicKeyToken = null]]'無法反序列化,因爲未找到所需的 數據成員'值'。

我序列化/反序列化Message記錄:

[<DataContract>] 
type Header = 
    { [<DataMember>] mutable ID   : int 
     [<DataMember>] mutable Description : string } 

[<DataContract>] 
type Message = 
    { [<DataMember>] mutable ID   : int 
     [<DataMember>] mutable Header  : Header option 
     [<DataMember>] mutable SenderID : string 
     [<DataMember>] mutable ReceiverID : string } 

我用反序列化JSON的代碼:

let deserializeJson<'a> (s:string) = 
    use ms = new MemoryStream(ASCIIEncoding.ASCII.GetBytes s) 
    let serialize = DataContractJsonSerializer(typeof<'a>) 
    serialize.ReadObject ms :?> 'a 

與實際生JSON結果:

"Message": 
{ 
    "ID":13, 
    "Header": { "Value":{"ID":21,"Description":"some"}}, 
    "SenderID":"312345332423", 
    "ReceiverID":"16564543423" 
} 

問題:如何反序列化'a option

更新

ASP.NET MVC使用JavaScriptSerializer默認序列化對象和我使用DataContractJsonSerializer反序列化。

出於某種原因,看起來DataContractJsonSerializer無法讀取JSON字符串,除非該選項的Value屬性爲小寫字母(如@svick指出的那樣)。一個骯髒的修復方法是在返回的JSON字符串中將「Value」替換爲「value」,但我選擇了Roberts的建議。

+0

JSON字符串是怎樣的? – svick 2012-02-12 20:54:24

+0

@svick,請參閱更新。 – ebb 2012-02-12 20:54:34

+0

你如何序列化它?顯而易見的方式爲我拋出一個例外。另外,運行'deserializeJson'時,我得到了相同的異常(抱怨沒有set訪問器)。 – svick 2012-02-12 21:07:49

回答

1

如果你要跳到使用json.net(a.k.a Newtonsoft.Json),而不是隨.NET Framework中的JSON序列,那麼你可以使用option serializer我建,讓我與ravendb更有效地工作。應該只是用序列化程序註冊轉換器並調用Deserialize。