還來一篇說下json_value 以及 json_query 的應用 (3)


上一篇說了一下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的位置,報錯來,所以無法進行下去。所以語句就報語法錯誤。就是這個道理。

 

如果說得不對,歡迎大家繼續拍磚

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM