Данные 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).

Другие вопросы по тегам