В F # я использую JavascriptSerializer.DeserializeObject
для чтения в файл JSON.Это дает мне Dictionary<string, object>
, и для любого такого значения (которое может быть во время выполнения int
, string
, bool
и т. Д.) Во время компиляции я знаю только, что это объект.
Я знаю, что для моего ввода определенные ключи всегда будут иметь определенные типы, связанные с ними, но для перевода требуется довольно некрасивый код.Например:
// deserialize the text, casting to a dictionary
let parsed = ... :?> Dictionary<string, System.Object>
type MyValue =
| Scalar of string
| Array of string[]
// myValue may be either string or string[]
// convert to F# discriminated union of Scalar|Array
let myValue = match parsed.["myValue"] with
| :? (Object[]) as obj -> Array (obj |> Array.map (fun o -> o :?> string))
| obj -> Scalar (obj :?> string)
Есть ли более чистый, возможно, более безопасный идиоматичный способ сделать это, все еще используя JavascriptSerializer?