в int option конвертнуть? Пользуюсь FSharp.SystemTextJson
Вот такой пример
type RecordWithNulls = {
[<JsonName "count">] Count: int option
}
let [<Literal>] json5 = """{"count": null}"""
let result = JsonSerializer.Deserialize<RecordWithNulls>(json5, options)
Возращает ошибку: System.Text.Json.JsonException: The JSON value could not be converted to System.Int32. Path: $ | LineNumber: 0 | BytePositionInLine: 4.
Опции сейчас такие
let options =
JsonFSharpOptions.Default()
.WithAllowNullFields()
.WithSkippableOptionFields()
.ToJsonSerializerOptions()
В целом опция .WithAllowNullFields() решают мою проблему можно убрать option и при null будет 0 как дефолт, но хочется уже добить именно с option.
https://github.com/Tarmil/FSharp.SystemTextJson/blob/1b6dbd9f6fd5cfe46d8ec9c52bf1a99f8ef0395a/tests/FSharp.SystemTextJson.Tests/Test.Regression.fs#L74 https://github.com/Tarmil/FSharp.SystemTextJson/blob/master/README.md#faq
FYI если есть возможность пользоваться нутонсофтом, то там есть доп пакет Microsoft.FSharpLu.Json, где все это работает из коробки. И юнионы нормально обрабатывает тоже
Там null или поле отсутствует?
null с отсутсвующими полями ок тоже все
Спасибо, попробую
Как я понял предложение попробовать UnwrapOptions но он для сериализации - я его тоже ставил, у меня с десериализацией проблема
Эта либа не допилена до конца. Она не поддерживает изменения и обработку сеттингов из .net 8.0. Возможно 7.0 тоже. Как раз касается обработки null'ов. Добавить это всё несложно, но автор её вроде пропал и не реагирует особо. Поэтому будет кто PR мержить или нет — неизвестно.
Это я к тому, что она полностью переопределяет конвертер, и анализирует нативный конфиг от System.Text.Json. Т.к. под последние версии её не обновляли, то часть настроек, когда ты их добавляешь, не даёт никакого эффекта, просто потому что они никак не обрабатывается конвертером рекордов из этой либы. Также либа задизайнена так, что подписать то нужно со стороны — т.е. не меняя её саму — довольно трудно. Можно было бы хотя бы наследоваться от конвертера, но там нужные функции, которые, в частности, решают как поступать с null-ами, сделаны приватными, и следовательно ты там никак не подлезешь. Недавно разбирал и дибагал эту либу.
Обсуждают сегодня