2017-04-19 39 views
2

我用的尝试使用JSON提供从FSharp.Data http://fsharp.github.io/FSharp.Data/library/JsonProvider.htmlF#的JSON类提供商:让行/列名

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 < ...>根= { “请求”:[ [ “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 

val it:decimal [] [] = [| [| 0.00001593M; 17805.17982312M |] [| 0.00001591M; 71659.725M |] [| 0.00001590M; 67600.19748428M |] |]

是有一个方法来获得作为输出

[ “询问”, “出价”; “的isFrozen”; “SEQ”]

,如果我没有从一些函数/法“投标”,在一些变量varname得到的是有像一个函数(在这种特殊情况下)

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

,并返回BookOrderNow.Bids的价值?

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

谢谢你的任何建议。这是我第一次试图通过@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)) 

但是使用这个库严重

+3

‘型供应商是最适合于该架构是稳定在运行时编译代码的生命周期中的情况。’ - https://docs.microsoft.com/en -us/DOTNET /用品/ fsharp /教程/类型供应商/制造-A型供应商 – Matiasd

回答

1

的答案给了我,按照从@Matiasd的评论,

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

谢谢你们两个