Во-первых, получить схему и разобрать:шаблон соответствия на предоставляемые виды
type desc = JsonProvider< """[{"name": "", "age": 1}]""", InferTypesFromValues=true >
let json = """[{"name": "Kitten", "age": 322}]"""
let typedJson = desc.Parse(json)
Теперь мы можем получить доступ к typedJson.[0]
.Age и .name свойства, однако, я хотел бы шаблон матч на них во время компиляции -time, чтобы получить ошибку, если схема была изменена.
Поскольку эти свойства удаляются, и мы не можем получить их во время выполнения:
let ``returns false``() =
typedJson.[0].GetType()
.FindMembers(MemberTypes.All, BindingFlags.Public ||| BindingFlags.Instance,
MemberFilter(fun _ _ -> true), null)
|> Array.exists (fun m -> m.ToString().Contains("Age"))
... Я сделал выполнения проверочную версию с использованием активных моделей:
let (|Name|Age|) k =
let toID = NameUtils.uniqueGenerator NameUtils.nicePascalName
let idk = toID k
match idk with
| _ when idk.Equals("Age") -> Age
| _ when idk.Equals("Name") -> Name
| ex_val -> failwith (sprintf "\"%s\" shouldn't even compile!" ex_val)
typedJson.[0].JsonValue.Properties()
|> Array.map (fun (k, v) ->
match k with
| Age -> v.AsInteger().ToString() // ...
| Name -> v.AsString()) // ...
|> Array.iter (printfn "%A")
В теория, если FSharp.Data
не была ОС, я бы не смог реализовать toID
. Как правило, весь подход кажется неправильным и переделывает работу.
Я знаю, что дискриминационные союзы не могут быть сгенерированы с использованием поставщиков типов, но, может быть, есть лучший способ сделать все эти проверки во время компиляции?
Спасибо! Но я пытаюсь получить ошибку компилятора, если я добавлю новое поле, например. «Цвет» в json-схему, а затем проигнорировать ее, а затем обработать. В случае союзов это будет мгновенный FS0025. – yuyoyuppe
@yuyoyuppe Что вы подразумеваете под * игнорированием * it? Должны ли вы касаться всех полей документа? –
Да, я должен обработать все поля, поэтому я не могу полагаться на '_'. Я хочу, чтобы при изменении схемы моя программа F # не собиралась без добавления необходимых функций обработки (а не просто игнорирования нового поля или сбоя во время выполнения). – yuyoyuppe