當試圖從反序列化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的建議。
JSON字符串是怎樣的? – svick 2012-02-12 20:54:24
@svick,請參閱更新。 – ebb 2012-02-12 20:54:34
你如何序列化它?顯而易見的方式爲我拋出一個例外。另外,運行'deserializeJson'時,我得到了相同的異常(抱怨沒有set訪問器)。 – svick 2012-02-12 21:07:49