Сериализация JSON для типов опций

Я сталкиваюсь с проблемой, когда определяю поле типа параметра при сериализации для JSON.

До работы (без вариантов)

[<DataContract>]
type Article = {
    [<field: DataMemberAttribute(Name="version") >]
    version: string
}

После выдает ошибку (с опцией)

[<DataContract>]
type Article = {
    [<field: DataMemberAttribute(Name="version") >]
    version: string option
}

метод вызвал исключение: System.Runtime.Serialization.SerializationException: Ожидается состояние «Элемент».. Обнаружен «Текст» с именем «», пространство имен».

Связанный код

let response = request.GetResponse() :?> HttpWebResponse
use reader = new StreamReader(response.GetResponseStream())
use memoryStream = new MemoryStream(ASCIIEncoding.Default.GetBytes(reader.ReadToEnd())) 
let result = (new DataContractJsonSerializer(typeof<Article>)).ReadObject(memoryStream) :?> Article

person App2015    schedule 16.03.2018    source источник
comment
DataContractJsonSerializer не знает о option. Не имеет встроенного способа десериализации. Используйте Nullable.   -  person Fyodor Soikin    schedule 16.03.2018
comment
нужна помощь по синтаксису, пожалуйста, как написать и применить Nullable для поля?   -  person App2015    schedule 16.03.2018
comment
Как насчет чтения документы или использовать Google?   -  person Fyodor Soikin    schedule 16.03.2018
comment
все еще не ясно, это [<field: DataMemberAttribute(Name="version") >] version: string option Nullable ?   -  person App2015    schedule 16.03.2018
comment
Я прочитал всю страницу, все еще очень запутался, не могли бы вы написать мне ответ. Синтаксис C# и VB.NET понятен, то есть использовать int? и т.д., но не f#   -  person App2015    schedule 16.03.2018
comment
определение типа точно такое же. Вы действительно должны использовать newtonsoft.json для сериализации. Существует значение nullable int, но нет строки, допускающей значение null. Потому что строка уже может быть нулевой.   -  person s952163    schedule 16.03.2018
comment
посмотреть примеры   -  person s952163    schedule 16.03.2018


Ответы (1)


Вот определение с обнуляемым int. Строка уже может быть нулевой, о чем свидетельствуют бесчисленные ссылочные исключения Null...

open System
[<DataContract>]
type Person2 = {
    [<DataMember(Name="Name") >]
    entityName: Nullable<int> 
    [<DataMember(Name="Type") >]
    entityType: String
}

Однако, если вы планируете заполнить это кучей нулей, возможно, вам следует рассмотреть класс. Это действительно ужасно, но вот как это выглядит:

let p1 = { entityName =  Nullable(10); entityType = "John"}
let p2 = { entityName =  System.Nullable(); entityType = null}

val p1 : Person2 = {entityName = 10;
entityType = John;}

val p2 : Person2 = {entityName = null;
entityType = null;}

person s952163    schedule 16.03.2018
comment
Спасибо, я заметил, что вы призываете меня использовать newtonsoft.json, но речь идет об изучении этих глубоких знаний, понимании того, как все работает под капотом, это реальные вещи, которые вы знаете, и этот низкий уровень не так легко доступен, что у вас есть приходит с опытом Я понимаю, что делать что-то в библиотеке легко, а так сложно, но я хочу увидеть все углы, с которыми я собираюсь столкнуться для обучения :), и я ценю, что вы делитесь своими знаниями. - person App2015; 17.03.2018
comment
вопрос, когда вы говорите zillions of Null reference exceptions attest..., что вы имели в виду? - person App2015; 17.03.2018
comment
также вы доступны для консультации? - person App2015; 17.03.2018
comment
строки нам в основном нужны при сериализации json, поэтому вы говорите, что нет выхода для наличия необязательной строки, если мне нужно сериализовать json, но тогда это говорит мне о чем-то, что вообще не иметь необязательных строк, у архитекторов должны быть причины за этим, так почему бы мне не направиться в том направлении, в котором архитекторы языка хотят, чтобы я шел, то есть не иметь необязательных строк, и когда я создаю записи, я предоставляю пустые строки для инициализации или основываю их на некоторых defaultRecords, просто думая сбоку. - person App2015; 17.03.2018
comment
вам следует посетить чат F# или FSSF F# Slack для расширенного обсуждения или напишите мне в твиттере. - person s952163; 17.03.2018
comment
Вы можете, конечно, иметь string option. И вы также можете сериализовать его. Ваши проблемы возникают из-за попытки использовать DataContractJsonSerializer. Во-первых, он старый, во-вторых, он не является частью основной библиотеки, это просто еще одна библиотека в .NET. Когда он был отправлен, либо F# все еще находился в разработке, либо о нем просто забыли, поэтому никто не написал сериализатор для типов опций. Так что это не похоже на то, что вы используете какой-то встроенный лучший в своем классе сериализатор. У Newtonsoft.JSON могут быть свои проблемы, но это библиотека nuget номер 1 по загрузкам. И он делает то, что вы хотите... - person s952163; 17.03.2018
comment
у вас есть электронная почта, с которой я могу связаться - person App2015; 17.03.2018