F#和Web API Json,用于在数据框架中进行分析
我试图通过重写python中的一些脚本来学习F#,在这里我查询graphql端点并将json加载到Pandas数据帧中进行清理和分析: json如下所示:F#和Web API Json,用于在数据框架中进行分析,json,f#,deedle,fsharp.data.typeproviders,Json,F#,Deedle,Fsharp.data.typeproviders,我试图通过重写python中的一些脚本来学习F#,在这里我查询graphql端点并将json加载到Pandas数据帧中进行清理和分析: json如下所示: apiResponse = {"data": {"Shipments":{"ErrorMessage":null, "Success":true,
apiResponse = {"data":
{"Shipments":{"ErrorMessage":null,
"Success":true,
"ValidationResult":null,
"TotalCount":494,
"Data":[
{"Building":"B7",
"Comment":"Test",
"CompletedDate":"2021-04-12T10:13:13.436Z",
"ItemId":"dd4520bb-aa0a-...",
"NoOfUnit":5,
"Organization":{
"OrganizationId":"cac43a32-1f08-...",
"OrganizationName":"XXX"},
"Adress":"Road 5"
},
{"Building":"B7",
....}]}}}
open Newtonsoft.Json.Linq
type Datum =
{
Building : string
Comment : string
CompletedDate : DateTime
ItemId : Guid
NoOfUnit : int
Organization :
{|
OrganizationId : Guid
OrganizationName : string
|}
Adress : string
}
let jobj = JObject.Parse(apiResponse)
let frame =
jobj.["data"].["Shipments"].["Data"].Children()
|> Seq.map (fun jtok -> jtok.ToObject<Datum>())
|> Frame.ofRecords
Python:
data = request.json()
#only the "Data" path
json_list = data['data']['Shipments']['Data']
df = json_normalize(json_list)
与使用Fsharp.Data的方法相同,而“file.json”只是“Data[]”部分(我试图创建一个fiddle,但无法运行它:
类型ApiTypes=JsonProvider//其中file.json只有apiResponse的“数据”路径
让jsonResponse=JsonValue.Parse(apiResponse)
让data=jsonResponse?数据
让装运=数据?装运
让数据=装运?数据
让输入=
Parse(Data.ToString())
设df=Frame.ofRecords输入
但这是行不通的。
所以我的问题是:
谢谢我没有使用Deedle的任何经验,但我认为记录的
工作正常,因此它可能与JsonProvider
不兼容(至少我无法让它工作)
相反,我会手动定义类型,然后反序列化到它,如下所示:
apiResponse = {"data":
{"Shipments":{"ErrorMessage":null,
"Success":true,
"ValidationResult":null,
"TotalCount":494,
"Data":[
{"Building":"B7",
"Comment":"Test",
"CompletedDate":"2021-04-12T10:13:13.436Z",
"ItemId":"dd4520bb-aa0a-...",
"NoOfUnit":5,
"Organization":{
"OrganizationId":"cac43a32-1f08-...",
"OrganizationName":"XXX"},
"Adress":"Road 5"
},
{"Building":"B7",
....}]}}}
open Newtonsoft.Json.Linq
type Datum =
{
Building : string
Comment : string
CompletedDate : DateTime
ItemId : Guid
NoOfUnit : int
Organization :
{|
OrganizationId : Guid
OrganizationName : string
|}
Adress : string
}
let jobj = JObject.Parse(apiResponse)
let frame =
jobj.["data"].["Shipments"].["Data"].Children()
|> Seq.map (fun jtok -> jtok.ToObject<Datum>())
|> Frame.ofRecords
打开Newtonsoft.Json.Linq
类型基准=
{
建筑物:字符串
注释:string
完成日期:日期时间
ItemId:Guid
NoOfUnit:int
组织:
{|
组织ID:Guid
组织名称:字符串
|}
地址:string
}
让jobj=JObject.Parse(apiResponse)
让框架=
jobj.[“数据”]。[装运].[数据”].子项()
|>Seq.map(乐趣jtok->jtok.ToObject())
|>记录框架
好的,这将是我的下一个方法,我自己定义类型。我会尝试一下。你为什么称类型为“Datum”?我问,因为JsonProvider在我加载完整的Json时也这么做。结构中的数据和数据的命名是问题吗?“Datum”只是“data”的单数形式.我故意使用了与JsonProvider相同的名称。名称没有问题。在德语中,“Datum”表示“date”,这让我很困惑…..谢谢,这很有效。为了完成,我必须用`Nullable`.[{“Item1”:“xxx”处理DateTime
类型的一些null
值。现在我只需要找出如何处理json中的空数组。实际上,问题不是空数组,而是类似于ShipmentContent:[{“Item1”:“xxx”的列表,“Item2”:“yyy”}]
它给出了错误。