2012-02-12 10 views
2

JSON文字列から返される型Header optionのレコードメンバーをデシリアライズしようとすると、私は次の例外を取得:デシリアライズオプション<'a>

データ契約タイプ 「Microsoft.FSharp.Core.FSharpOption`1を[必要な データメンバー 'value'が見つかりませんでしたので、[MyWeb.Controllers.Header、 MyWeb.Controllers、Version = 0.0.0.0、Culture = neutral、 PublicKeyToken = null]] 'をデシリアライズできません。

私はMessage記録デシリアライズ/シリアライズだ:私はJSONをデシリアライズするために使用

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

コード:

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

質問:どのように私は0123を逆直列化するのですか??

更新

ASP.NET MVCは、オブジェクトをシリアル化するために、デフォルトでJavaScriptSerializerを使用し、私はデシリアライズするDataContractJsonSerializerを使用しています。

何らかの理由で、Valueプロパティが小文字(@svickで指摘されている)でない限り、DataContractJsonSerializerはJSON文字列を読み取れないようです。汚れた修正は返されたJSON文字列の "Value"を "value"に置き換えることですが、私はRobertsの提案に従うことにしました。

+0

JSON文字列はどのように見えますか? – svick

+0

@svick、更新を参照してください。 – ebb

+0

そしてどうやってそれを直列化しますか?明白な方法は私のために例外を投げる。また、 'deserializeJson'を実行しているときと同じ例外があります(設定されたアクセサがないという不満)。 – svick

答えて

1

.NETフレームワークに付属のjsonシリアライザの代わりにjson.net(a.k.a Newtonsoft.Json)を使用していたら、option serializerを使用してravendbでより効果的に作業できるようになりました。シリアライザに変換を登録し、Deserializeを呼び出すだけの問題です。

関連する問題