gpt4 book ai didi

json - FSharp.Data——如何处理空 JSON 值?

转载 作者:行者123 更新时间:2023-12-01 14:44:40 24 4
gpt4 key购买 nike

我正在尝试将 FSharp.Data 示例转换为我正在处理的问题的解决方案,但我只是没有走得太远。

问题

给定一个返回 json 的端点,类似于:

{
Products:[{
Id:43,
Name:"hi"
},
{
Id:45,
Name:"other prod"
}
]
}

我怎样才能加载数据然后只得到 Id没有真实的现有数据?

我不明白如何“模式匹配”以下可能性:
  • 它什么都不会返回
  • root.Products可能不存在/为空
  • Id可能不存在

  • 通过空匹配尝试
    namespace Printio

    open System
    open FSharp.Data
    open FSharp.Data.JsonExtensions

    module PrintioApi =
    type ApiProducts = JsonProvider<"https://api.print.io/api/v/1/source/widget/products?recipeId=f255af6f-9614-4fe2-aa8b-1b77b936d9d6&countryCode=US">

    let getProductIds url =
    async {
    let! json = ApiProducts.AsyncLoad url
    let ids = match json with
    | null -> [||]
    | _ ->
    match json.Products with
    | null -> [||]
    | _ -> Array.map (fun (x:ApiProducts.Product)-> x.Id) json.Products

    return ids
    }

    最佳答案

    编辑:当我写这个答案时,我并没有完全理解 JSON 类型提供程序的功能。事实证明,您可以使用示例 JSON 文档列表填充它,这使您能够处理可能存在或不存在数据的各种场景。这些天我经常使用它,所以我不再相信我最初写的东西。我将在此处保留原始答案,以防任何人都可以从中获得任何值(value)。

    见我的other answer here on the page演示我今天将如何做。

    虽然类型提供程序很好,但我认为尝试将像 JSON 这样没有模式和类型安全的东西视为强类型数据在概念上是错误的。我没有使用类型提供程序,而是使用 HttpClient , Json.NET , 和 FSharp.Interop.Dynamic编写这样的查询:

    let response = client.GetAsync("").Result
    let json = response.Content.ReadAsJsonAsync().Result
    let links = json?links :> obj seq
    let address =
    links
    |> Seq.filter (fun l -> l?rel <> null && l?href <> null)
    |> Seq.filter (fun l -> l?rel.ToString() = rel)
    |> Seq.map (fun l -> Uri(l?href.ToString()))
    |> Seq.exactlyOne

    在哪里 clientHttpClient 的一个实例, 和 ReadAsJsonAsync是一个像这样定义的小辅助方法:
    type HttpContent with
    member this.ReadAsJsonAsync() =
    let readJson (t : Task<string>) =
    JsonConvert.DeserializeObject t.Result
    this.ReadAsStringAsync().ContinueWith(fun t -> readJson t)

    关于json - FSharp.Data——如何处理空 JSON 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25058524/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com