【问题标题】:JSON type provider for F#: getting rows/column namesF# 的 JSON 类型提供程序:获取行/列名称
【发布时间】:2017-04-19 02:58:50
【问题描述】:

我正在尝试使用来自 FSharp.Data 的 JSON Provider http://fsharp.github.io/FSharp.Data/library/JsonProvider.html

type BookOrder = JsonProvider<"../Documents/sample.json">

let commandType = "returnOrderBook" 
let currencyPair = "BTC_NXT"
let depth = string 3

let polReq = "https://poloniex.com/public?" + "command=" + commandType + "&currencyPair=" + currencyPair + "&depth="
+ depth

let BookOrderNow = BookOrder.Load(polReq)

val BookOrderNow : JsonProvider<...>.Root =   {   "asks": [ [ "0.00001605", 14636.67789781 ], [ "0.00001606", 73739.31116785 ], [ "0.00001607", 1342158.7102721 ] ],   "出价": [ [ "0.00001593", 17805.17982312 ], [ "0.00001591", 71659.725 ], [ "0.00001590", 67600.19748428 ] ]、“isFrozen”:“0”、“seq”:29534867 }

BookOrderNow.Bids

 

验证它:十进制 [] [] =   [|[|0.00001593M; 17805.17982312M|]; [|0.00001591M; 71659.725M|]; [|0.00001590M; 67600.19748428M|]|]

有没有办法获取输出

["asks";"bids";"isFrozen";"seq"]

?

如果我确实从某个变量varname 中的某个函数/方法“投标”中得到了类似的函数(在这种特殊情况下)

GetJsonContent: JsonProvider<...>.Root -> string -> ???
GetJsonContent BookOrderNow varname

并返回 BookOrderNow.Bids 的值?

我的意思是,如果我们提前知道 JSON 文件的内容,我们就不需要这样做,但如果我们不知道,...?最终我想把数据放在 Deedle Frame / Series 对象中

感谢您的任何建议。这是我第一次尝试认真使用这个库

【问题讨论】:

标签: json f# type-providers f#-data deedle


【解决方案1】:

@FoggyFinder 给了我答案

BookOrderNow.JsonValue.Properties()
   |> Seq.map fst
   |> printfn "%A" //=> seq ["asks"; "bids"; "isFrozen"; "seq"]

let getJsonContent (x:BookOrder.Root) varname =
    x.JsonValue.GetProperty varname
    |> JsonExtensions.AsArray
    |> Array.map
        (JsonExtensions.AsArray >> Array.map (JsonExtensions.AsDecimal))

但是,根据@Matiasd 的评论,

“类型提供程序最适合架构在运行时和编译代码的生命周期内稳定的情况。”

谢谢你们俩

【讨论】:

    猜你喜欢
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    相关资源
    最近更新 更多