gpt4 book ai didi

f# - JsonProvider<...>.Root 没有 null 作为正确的值

转载 作者:行者123 更新时间:2023-12-05 00:58:33 26 4
gpt4 key购买 nike

我正在尝试查询已解析的 Json 的结果,如果找不到我想做其他事情。

[
{
"orderId": 136,
"quantity": 5,
"price": 3.75
},
{
"orderId": 129,
"quantity": 9,
"price": 3.55
},
{
"orderId": 113,
"quantity": 11,
"price": 3.75
}
]

我的代码是这样的:

type OrdersProvider = JsonProvider<"Orders.json">
let orders = OrdersProvider.GetSamples()

let test id =
let res = query{
for i in orders do
where (i.OrderId = id)
select i
headOrDefault
}

if isNull(res)
then NOT_FOUND("")
else OK(res.JsonValue.ToString())
)

但是我收到编译器错误“JsonProvider<...>.Root 没有 null 作为正确的值”。这是有道理的,除非我仍然想捕获 id 不在文件中的情况。我想我可以将 headOrDefault 更改为 head 并捕获异常,但想知道是否有更好的方法。

更新#1:通过评论中的一个链接,我得以摆脱

    if obj.ReferenceEquals(res,null)
then NOT_FOUND("")
else OK(res.JsonValue.ToString())
)

更新#2:虽然提到的代码有效,但对于该语言来说仍然感觉不自然。接受的答案看起来更自然。

最佳答案

我认为 headOrDefault 操作是为了与 LINQ to SQL 兼容而设计的,这就是它在默认情况下返回 null 的原因 - 这不是您通常会返回的内容需要行为良好的 F# 代码,因此按照查询的方式使用它不是一个好主意。

幸运的是,headOrDefault 将与 F# 选项类型一起使用 - 如果您从 select 子句返回 Some 然后 headOrDefault 当值不可用时返回 None:

let res = 
query {
for i in orders do
where (i.OrderId = id)
select (Some i)
headOrDefault }

现在您可以使用模式匹配处理丢失的情况:

match res with
| None -> NOT_FOUND("")
| Some order -> OK(order.JsonValue.ToString())

关于f# - JsonProvider<...>.Root 没有 null 作为正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46006593/

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