Опция десериализации <'a> - PullRequest
       17

Опция десериализации <'a>

2 голосов
/ 13 февраля 2012

При попытке десериализации члена записи типа Header option, возвращенного из строки JSON, я получаю следующее исключение:

Тип контракта данных 'Microsoft.FSharp.Core.FSharpOption`1[[MyWeb.Controllers.Header, MyWeb.Controllers, версия = 0.0.0.0, культура = нейтральный, PublicKeyToken = null]] 'не может быть десериализовано, поскольку не найдено требуемое значение элемента данных' *.1007 * Я сериализую / десериализую запись 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, но я решил пойти по совету Робертса.

1 Ответ

1 голос
/ 13 февраля 2012

Если вы захотите использовать json.net (он же Newtonsoft.Json) вместо сериализатора json, который поставляется с .NET Framework, то вы можете использовать опциональный сериализатор 1004 * Я построил, чтобы позволить мне более эффективно работать с ravendb.Нужно просто зарегистрировать конвертирование в сериализаторе и вызвать Deserialize.

...