Данные F#: JSON Parser. Использование JsonExtensions
Это мой первый вопрос по ТАК... так что не судите строго =)
Обычно все мои вопросы обсуждаются в чатах (поверьте, их много =)).
В последнее время речь идет о RosettaCode. И я хотел бы дополнить код некоторых задач до F#
Одним из них является JSON.
Одним из возможных решений является использование "F# Data: JSON Parser". Так что мой вопрос с этим связан.
Этот код хорошо работает:
open FSharp.Data
open FSharp.Data.JsonExtensions
type Person = {ID: int; Name:string}
let json = """[ { "ID": 1, "Name": "First" }, { "ID": 2, "Name": "Second" }]"""
json |> printfn "%s"
match JsonValue.Parse(json) with
| JsonValue.Array(x) ->
x |> Array.map(fun x -> {ID = System.Int32.Parse((x?ID).ToString()); Name = (string x?Name)})
| _ -> failwith "fail json"
|> Array.iter(fun x -> printfn "%i %s" x.ID x.Name)
Распечатать:
[ { "ID": 1, "Name": "First" }, { "ID": 2, "Name": "Second" }]
1 "First"
2 "Second"
Но это
{ID = System.Int32.Parse((x?ID).ToString()); Name = (string x?Name)}
не выглядит хорошо.
Это я читал о JsonExtensions,
но когда я использую
{ID = (x?ID.AsInteger()) ; Name = (x?Name.AsString()) }
Я получаю ошибки компиляции:
Поле, конструктор или "AsInteger" не определены
Поле, конструктор или "AsString" не определены
Странно, дело в том, что я вижу доступность через "open FSharp.Data.JsonExtensions"
Итак, вопрос: как использовать JsonExtensions?
1 ответ
Я попытался воспроизвести это, используя минимальный пример, но я не получаю ошибку - вы можете попробовать следующий минимальный пример?
#r "...../FSharp.Data.dll"
open FSharp.Data.JsonExtensions
open FSharp.Data
JsonValue.Parse("A").AsArray()
|> Array.map (fun a -> a?ID.AsInteger())
Я не получаю автозаполнение a?ID.
(что является ограничением редактора), но компилируется нормально.
Единственная причина, почему я думаю, что это может не сработать, это если у вас был другой open
декларация, которая будет импортировать другую реализацию ?
оператор, который не возвращается JsonValue
,
JsonValue
API, конечно, не так хорош, как просто использование провайдера типов - поэтому, если вы можете, я бы, вероятно, выбрал провайдера типов (низкоуровневый API хорош, если вам нужно рекурсивно перебирать все в JSON).