上一篇說了一下openjson 的一些使用方法,這次再說一下在2016裡面的查詢取值,當然就是 json_query 和 json_value 這2兄弟了 首先 可以看到,對於json_value 來說,如果說取到的屬性並不能直接解析成int,string,bool 這3種類型(那就是說 array ...
上一篇說了一下openjson 的一些使用方法,這次再說一下在2016裡面的查詢取值,當然就是 json_query 和 json_value 這2兄弟了
首先
declare @json varchar(100) = '{"a":"[6,4]","b":[7,4],"c":"hi"}' select json_query(@json,'$.a'),json_value(@json,'$.a') NULL [6,4] select json_query(@json,'$.b'),json_value(@json,'$.b') [7,4] NULL select json_query(@json,'$.b[1]'),json_value(@json,'$.b[1]') NULL 4 select json_query(@json,'$.c'),json_value(@json,'$.c') NULL hi
可以看到,對於json_value 來說,如果說取到的屬性並不能直接解析成int,string,bool 這3種類型(那就是說 array 類型和 Object 類型是返回空的),
而json_query 則剛剛相反,對於能解析成int,string,bool 的項,它直接返回Null值,對於 array 和object 則把對應的元素返回。這2個的區別是要搞清楚的。
PS:對於這個json來說,它是解析時才會去檢測語法的。不像xml先檢查整個xml有沒有錯,然後再解析,改造一下上面的樣例,就是這個樣子
declare @json varchar(100) = '{"a":"[6,4]",d:[7,4],"c":"hi"}' select isjson(@json) select json_query(@json,'$.a'),json_value(@json,'$.a') select json_query(@json,'$.c'),json_value(@json,'$.c')
首先使用 isjson() 函數判斷@json 變數是否一個標準json 格式,很明顯不是,因為 d 的位置缺少了雙引號。所以返回0
那正常來說既然這樣的話下麵2個jsonquery 應該都報錯或者都返回 Null 才對。
然而 查詢a 的值的時候,是可以返回的,因為還沒有到分析錯誤的位置。所以 查詢a 的值的語句是有效的。返回 [6,4]
但是查詢c 的時候,因為需要經過d的位置,報錯來,所以無法進行下去。所以語句就報語法錯誤。就是這個道理。
如果說得不對,歡迎大家繼續拍磚