2017-09-01 39 views
2

我想查詢解析Json的結果,如果我找不到我想做其他事情。JsonProvider <...> .Root沒有爲空作爲適當的值

[ 
    { 
    "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 < ...>根沒有null作爲應有的價值。」這是有道理的,除非我還想在id不在文件中的情況下進行處理。我想我可以改變頭或默認頭和陷阱的例外,但不知道是否有更好的東西。

更新#1: 繼評論的鏈接之一,我能夠與

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

更新#2閃避: 雖然提到代碼的作品,但仍然感覺不自然的語言。接受的答案看起來更自然。

+0

看到這個答案:https://stackoverflow.com/a/11696947/679898,這是一個更普遍的問題,但解決方案應該適用。 – scrwtp

+0

可能重複的[類型沒有null作爲適當的值](https://stackoverflow.com/questions/11696484/type-does-not-have-null-as-a-proper-value) – scrwtp

+0

@scrwtp它是不是https://stackoverflow.com/questions/11696484/type-does-not-have-null-as-a-proper-value的副本,除非有方法將屬性AllowNullLiteral應用於OrdersProvider.Root。但是另一個鏈接幫助。我能夠擺脫obj.ReferenceEquals – AlexanderM

回答

2

我覺得headOrDefault操作是專爲使用LINQ到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()) 
相關問題