Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#和Web API Json,用于在数据框架中进行分析_Json_F#_Deedle_Fsharp.data.typeproviders - Fatal编程技术网

F#和Web API 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,

我试图通过重写python中的一些脚本来学习F#,在这里我查询graphql端点并将json加载到Pandas数据帧中进行清理和分析:

json如下所示:

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输入
但这是行不通的。 所以我的问题是:

  • 这是使用json的正确方法吗
  • 有没有更好的方法用json创建数据帧
  • 谢谢你的帮助。
    谢谢

    我没有使用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”}]
    它给出了错误。