使用 TSQL 解析 JSON 字符串
Parse JSON String with TSQL
我对如何使用 TSQL 解析 JSON 字符串有点困惑。
我已经看了几个小时的 Youtube 电影,但不幸的是我还没有找到解决方案。
这是JSON字符串:
{"event":"2018","owner_id":"393235","members":{"623118":{"local_score":4,"stars":1,"global_score":0,"name":"thomas ","id":"623118","last_star_ts":"1573807967","completion_day_level":{"1":{"1":{"get_star_ts":"1573807967"}}}},"627679":{"name":"Dickkieee","last_star_ts":0,"completion_day_level":{},"id":"627679","global_score":0,"stars":0,"local_score":0},"623352":{"id":"623352","last_star_ts":0,"completion_day_level":{},"name":"Gerjon ","local_score":0,"stars":0,"global_score":0},"622595":{"local_score":0,"global_score":0,"stars":0,"id":"622595","last_star_ts":0,"completion_day_level":{},"name":"dylan"},"622884":{"local_score":65,"stars":13,"global_score":0,"id":"622884","last_star_ts":"1574197009","completion_day_level":{"1":{"2":{"get_star_ts":"1573765256"},"1":{"get_star_ts":"1573760616"}},"4":{"2":{"get_star_ts":"1573993940"},"1":{"get_star_ts":"1573987479"}},"6":{"1":{"get_star_ts":"1574107994"},"2":{"get_star_ts":"1574147096"}},"3":{"1":{"get_star_ts":"1573826027"},"2":{"get_star_ts":"1573827152"}},"5":{"2":{"get_star_ts":"1574021152"},"1":{"get_star_ts":"1573995867"}},"7":{"1":{"get_star_ts":"1574197009"}},"2":{"2":{"get_star_ts":"1573773372"},"1":{"get_star_ts":"1573768190"}}},"name":"Jeroen "},"393235":{"local_score":336,"stars":50,"global_score":0,"id":"393235","last_star_ts":"1546638507","completion_day_level":{"12":{"2":{"get_star_ts":"1544611601"},"1":{"get_star_ts":"1544607461"}},"2":{"2":{"get_star_ts":"1543839487"},"1":{"get_star_ts":"1543838455"}},"20":{"2":{"get_star_ts":"1545940671"},"1":{"get_star_ts":"1545940531"}},"15":{"1":{"get_star_ts":"1545255445"},"2":{"get_star_ts":"1545306775"}},"19":{"1":{"get_star_ts":"1545741466"},"2":{"get_star_ts":"1545915725"}},"18":{"2":{"get_star_ts":"1545605808"},"1":{"get_star_ts":"1545603795"}},"9":{"2":{"get_star_ts":"1544443203"},"1":{"get_star_ts":"1544362827"}},"6":{"2":{"get_star_ts":"1544090831"},"1":{"get_star_ts":"1544090372"}},"13":{"1":{"get_star_ts":"1544781604"},"2":{"get_star_ts":"1544959450"}},"5":{"1":{"get_star_ts":"1544007960"},"2":{"get_star_ts":"1544012691"}},"4":{"2":{"get_star_ts":"1543915857"},"1":{"get_star_ts":"1543915751"}},"3":{"2":{"get_star_ts":"1543844810"},"1":{"get_star_ts":"1543844649"}},"1":{"2":{"get_star_ts":"1543828757"},"1":{"get_star_ts":"1543654211"}},"23":{"2":{"get_star_ts":"1546638474"},"1":{"get_star_ts":"1546262133"}},"17":{"2":{"get_star_ts":"1546159136"},"1":{"get_star_ts":"1546159088"}},"25":{"2":{"get_star_ts":"1546638507"},"1":{"get_star_ts":"1546441207"}},"7":{"1":{"get_star_ts":"1544177334"},"2":{"get_star_ts":"1544179024"}},"10":{"2":{"get_star_ts":"1544438249"},"1":{"get_star_ts":"1544438218"}},"8":{"2":{"get_star_ts":"1544273070"},"1":{"get_star_ts":"1544270337"}},"16":{"1":{"get_star_ts":"1545233633"},"2":{"get_star_ts":"1545338402"}},"14":{"2":{"get_star_ts":"1545028942"},"1":{"get_star_ts":"1544986949"}},"11":{"2":{"get_star_ts":"1544520723"},"1":{"get_star_ts":"1544517871"}},"22":{"1":{"get_star_ts":"1546213058"},"2":{"get_star_ts":"1546590986"}},"24":{"2":{"get_star_ts":"1546439078"},"1":{"get_star_ts":"1546433420"}},"21":{"1":{"get_star_ts":"1545947800"},"2":{"get_star_ts":"1546209802"}}},"name":"Wilfred"},"622705":{"stars":1,"global_score":0,"local_score":6,"last_star_ts":"1573741255","completion_day_level":{"1":{"1":{"get_star_ts":"1573741255"}}},"id":"622705","name":"William"}}}
在此先感谢您的帮助
您的问题没有提供足够的信息。但是您是新用户,我想在这方面帮助您。
因此提前一些重要提示
- 始终说明实际工具(供应商和版本!)。您用
[tsql]
标记了它,它指向 SQL-Server,但这不被允许。要获得 JSON 支持,您需要 SQL-Server v2016+.
- 尝试创建一个独立的、自运行样本。我们可以复制并粘贴到我们的机器上,然后单击 "run"。
- 始终提供预期的输出。
- 并且请将您的样本减少到所需的最低限度。两个
get_start_ts
节点足以理解 1:n
关系。
- 而且我希望,你改变了人们的名字......没有人愿意在互联网上的某个地方找到他们的名字......
关于您的 JSON 的一些提示:
- 数据使用键是一种非常糟糕的风格。如果您可以更改 JSON 的创建,则应该将
"1": {"get_star_ts": "1545947800"},
更改为 "aBetterName": {"id":"1","get_star_ts": "1545947800"},
。
对于相当 包罗万象的 方法,您可以试试这个:
DECLARE @json NVARCHAR(MAX)=
N'{"event":"2018","owner_id":"393235","members":{"623118":{"local_score":4,"stars":1,"global_score":0,"name":"name hfkjfdshfsg","id":"623118","last_star_ts":"1573807967","completion_day_level":{"1":{"1":{"get_star_ts":"1573807967"}}}},"627679":{"name":"name hskjkdsafkdf","last_star_ts":0,"completion_day_level":{},"id":"627679","global_score":0,"stars":0,"local_score":0},"623352":{"id":"623352","last_star_ts":0,"completion_day_level":{},"name":"name utoireut","local_score":0,"stars":0,"global_score":0},"622595":{"local_score":0,"global_score":0,"stars":0,"id":"622595","last_star_ts":0,"completion_day_level":{},"name":"dylan"},"622884":{"local_score":65,"stars":13,"global_score":0,"id":"622884","last_star_ts":"1574197009","completion_day_level":{"1":{"2":{"get_star_ts":"1573765256"},"1":{"get_star_ts":"1573760616"}},"4":{"2":{"get_star_ts":"1573993940"},"1":{"get_star_ts":"1573987479"}},"6":{"1":{"get_star_ts":"1574107994"},"2":{"get_star_ts":"1574147096"}},"3":{"1":{"get_star_ts":"1573826027"},"2":{"get_star_ts":"1573827152"}},"5":{"2":{"get_star_ts":"1574021152"},"1":{"get_star_ts":"1573995867"}},"7":{"1":{"get_star_ts":"1574197009"}},"2":{"2":{"get_star_ts":"1573773372"},"1":{"get_star_ts":"1573768190"}}},"name":"name nbnnbvcb"},"393235":{"local_score":336,"stars":50,"global_score":0,"id":"393235","last_star_ts":"1546638507","completion_day_level":{"12":{"2":{"get_star_ts":"1544611601"},"1":{"get_star_ts":"1544607461"}},"2":{"2":{"get_star_ts":"1543839487"},"1":{"get_star_ts":"1543838455"}},"20":{"2":{"get_star_ts":"1545940671"},"1":{"get_star_ts":"1545940531"}},"15":{"1":{"get_star_ts":"1545255445"},"2":{"get_star_ts":"1545306775"}},"19":{"1":{"get_star_ts":"1545741466"},"2":{"get_star_ts":"1545915725"}},"18":{"2":{"get_star_ts":"1545605808"},"1":{"get_star_ts":"1545603795"}},"9":{"2":{"get_star_ts":"1544443203"},"1":{"get_star_ts":"1544362827"}},"6":{"2":{"get_star_ts":"1544090831"},"1":{"get_star_ts":"1544090372"}},"13":{"1":{"get_star_ts":"1544781604"},"2":{"get_star_ts":"1544959450"}},"5":{"1":{"get_star_ts":"1544007960"},"2":{"get_star_ts":"1544012691"}},"4":{"2":{"get_star_ts":"1543915857"},"1":{"get_star_ts":"1543915751"}},"3":{"2":{"get_star_ts":"1543844810"},"1":{"get_star_ts":"1543844649"}},"1":{"2":{"get_star_ts":"1543828757"},"1":{"get_star_ts":"1543654211"}},"23":{"2":{"get_star_ts":"1546638474"},"1":{"get_star_ts":"1546262133"}},"17":{"2":{"get_star_ts":"1546159136"},"1":{"get_star_ts":"1546159088"}},"25":{"2":{"get_star_ts":"1546638507"},"1":{"get_star_ts":"1546441207"}},"7":{"1":{"get_star_ts":"1544177334"},"2":{"get_star_ts":"1544179024"}},"10":{"2":{"get_star_ts":"1544438249"},"1":{"get_star_ts":"1544438218"}},"8":{"2":{"get_star_ts":"1544273070"},"1":{"get_star_ts":"1544270337"}},"16":{"1":{"get_star_ts":"1545233633"},"2":{"get_star_ts":"1545338402"}},"14":{"2":{"get_star_ts":"1545028942"},"1":{"get_star_ts":"1544986949"}},"11":{"2":{"get_star_ts":"1544520723"},"1":{"get_star_ts":"1544517871"}},"22":{"1":{"get_star_ts":"1546213058"},"2":{"get_star_ts":"1546590986"}},"24":{"2":{"get_star_ts":"1546439078"},"1":{"get_star_ts":"1546433420"}},"21":{"1":{"get_star_ts":"1545947800"},"2":{"get_star_ts":"1546209802"}}},"name":"name fsdf"},"622705":{"stars":1,"global_score":0,"local_score":6,"last_star_ts":"1573741255","completion_day_level":{"1":{"1":{"get_star_ts":"1573741255"}}},"id":"622705","name":"name ffdahlf"}}}';
SELECT A.[event]
,A.owner_id
,B.[key] AS MemberNumber
,C.id
,C.local_score
,C.global_score
,C.stars
,C.[name]
,C.last_star_ts
,D.[key] AS WhatEverNumberThisIs
,E.[key] AS AndWhatEverThisNumberIs
,JSON_VALUE(E.[value],'$.get_star_ts') AS get_star_ts
FROM OPENJSON(@json)
WITH([event] int
,owner_id int
,members NVARCHAR(MAX) AS JSON) A
CROSS APPLY OPENJSON(A.members) B
CROSS APPLY OPENJSON(B.[value])
WITH(local_score int
,stars int
,global_score int
,[name] NVARCHAR(1000)
,id int
,last_star_ts int
,completion_day_level NVARCHAR(MAX) AS JSON ) C
CROSS APPLY OPENJSON(C.completion_day_level) D
CROSS APPLY OPENJSON(D.[value]) E;
简而言之:
我们使用 OPENJSON
的级联。嵌套的 JSON 与 AS JSON
一起返回,可以在下一个 OPENJSON
.
中使用
我对如何使用 TSQL 解析 JSON 字符串有点困惑。 我已经看了几个小时的 Youtube 电影,但不幸的是我还没有找到解决方案。
这是JSON字符串:
{"event":"2018","owner_id":"393235","members":{"623118":{"local_score":4,"stars":1,"global_score":0,"name":"thomas ","id":"623118","last_star_ts":"1573807967","completion_day_level":{"1":{"1":{"get_star_ts":"1573807967"}}}},"627679":{"name":"Dickkieee","last_star_ts":0,"completion_day_level":{},"id":"627679","global_score":0,"stars":0,"local_score":0},"623352":{"id":"623352","last_star_ts":0,"completion_day_level":{},"name":"Gerjon ","local_score":0,"stars":0,"global_score":0},"622595":{"local_score":0,"global_score":0,"stars":0,"id":"622595","last_star_ts":0,"completion_day_level":{},"name":"dylan"},"622884":{"local_score":65,"stars":13,"global_score":0,"id":"622884","last_star_ts":"1574197009","completion_day_level":{"1":{"2":{"get_star_ts":"1573765256"},"1":{"get_star_ts":"1573760616"}},"4":{"2":{"get_star_ts":"1573993940"},"1":{"get_star_ts":"1573987479"}},"6":{"1":{"get_star_ts":"1574107994"},"2":{"get_star_ts":"1574147096"}},"3":{"1":{"get_star_ts":"1573826027"},"2":{"get_star_ts":"1573827152"}},"5":{"2":{"get_star_ts":"1574021152"},"1":{"get_star_ts":"1573995867"}},"7":{"1":{"get_star_ts":"1574197009"}},"2":{"2":{"get_star_ts":"1573773372"},"1":{"get_star_ts":"1573768190"}}},"name":"Jeroen "},"393235":{"local_score":336,"stars":50,"global_score":0,"id":"393235","last_star_ts":"1546638507","completion_day_level":{"12":{"2":{"get_star_ts":"1544611601"},"1":{"get_star_ts":"1544607461"}},"2":{"2":{"get_star_ts":"1543839487"},"1":{"get_star_ts":"1543838455"}},"20":{"2":{"get_star_ts":"1545940671"},"1":{"get_star_ts":"1545940531"}},"15":{"1":{"get_star_ts":"1545255445"},"2":{"get_star_ts":"1545306775"}},"19":{"1":{"get_star_ts":"1545741466"},"2":{"get_star_ts":"1545915725"}},"18":{"2":{"get_star_ts":"1545605808"},"1":{"get_star_ts":"1545603795"}},"9":{"2":{"get_star_ts":"1544443203"},"1":{"get_star_ts":"1544362827"}},"6":{"2":{"get_star_ts":"1544090831"},"1":{"get_star_ts":"1544090372"}},"13":{"1":{"get_star_ts":"1544781604"},"2":{"get_star_ts":"1544959450"}},"5":{"1":{"get_star_ts":"1544007960"},"2":{"get_star_ts":"1544012691"}},"4":{"2":{"get_star_ts":"1543915857"},"1":{"get_star_ts":"1543915751"}},"3":{"2":{"get_star_ts":"1543844810"},"1":{"get_star_ts":"1543844649"}},"1":{"2":{"get_star_ts":"1543828757"},"1":{"get_star_ts":"1543654211"}},"23":{"2":{"get_star_ts":"1546638474"},"1":{"get_star_ts":"1546262133"}},"17":{"2":{"get_star_ts":"1546159136"},"1":{"get_star_ts":"1546159088"}},"25":{"2":{"get_star_ts":"1546638507"},"1":{"get_star_ts":"1546441207"}},"7":{"1":{"get_star_ts":"1544177334"},"2":{"get_star_ts":"1544179024"}},"10":{"2":{"get_star_ts":"1544438249"},"1":{"get_star_ts":"1544438218"}},"8":{"2":{"get_star_ts":"1544273070"},"1":{"get_star_ts":"1544270337"}},"16":{"1":{"get_star_ts":"1545233633"},"2":{"get_star_ts":"1545338402"}},"14":{"2":{"get_star_ts":"1545028942"},"1":{"get_star_ts":"1544986949"}},"11":{"2":{"get_star_ts":"1544520723"},"1":{"get_star_ts":"1544517871"}},"22":{"1":{"get_star_ts":"1546213058"},"2":{"get_star_ts":"1546590986"}},"24":{"2":{"get_star_ts":"1546439078"},"1":{"get_star_ts":"1546433420"}},"21":{"1":{"get_star_ts":"1545947800"},"2":{"get_star_ts":"1546209802"}}},"name":"Wilfred"},"622705":{"stars":1,"global_score":0,"local_score":6,"last_star_ts":"1573741255","completion_day_level":{"1":{"1":{"get_star_ts":"1573741255"}}},"id":"622705","name":"William"}}}
在此先感谢您的帮助
您的问题没有提供足够的信息。但是您是新用户,我想在这方面帮助您。
因此提前一些重要提示
- 始终说明实际工具(供应商和版本!)。您用
[tsql]
标记了它,它指向 SQL-Server,但这不被允许。要获得 JSON 支持,您需要 SQL-Server v2016+. - 尝试创建一个独立的、自运行样本。我们可以复制并粘贴到我们的机器上,然后单击 "run"。
- 始终提供预期的输出。
- 并且请将您的样本减少到所需的最低限度。两个
get_start_ts
节点足以理解1:n
关系。 - 而且我希望,你改变了人们的名字......没有人愿意在互联网上的某个地方找到他们的名字......
关于您的 JSON 的一些提示:
- 数据使用键是一种非常糟糕的风格。如果您可以更改 JSON 的创建,则应该将
"1": {"get_star_ts": "1545947800"},
更改为"aBetterName": {"id":"1","get_star_ts": "1545947800"},
。
对于相当 包罗万象的 方法,您可以试试这个:
DECLARE @json NVARCHAR(MAX)=
N'{"event":"2018","owner_id":"393235","members":{"623118":{"local_score":4,"stars":1,"global_score":0,"name":"name hfkjfdshfsg","id":"623118","last_star_ts":"1573807967","completion_day_level":{"1":{"1":{"get_star_ts":"1573807967"}}}},"627679":{"name":"name hskjkdsafkdf","last_star_ts":0,"completion_day_level":{},"id":"627679","global_score":0,"stars":0,"local_score":0},"623352":{"id":"623352","last_star_ts":0,"completion_day_level":{},"name":"name utoireut","local_score":0,"stars":0,"global_score":0},"622595":{"local_score":0,"global_score":0,"stars":0,"id":"622595","last_star_ts":0,"completion_day_level":{},"name":"dylan"},"622884":{"local_score":65,"stars":13,"global_score":0,"id":"622884","last_star_ts":"1574197009","completion_day_level":{"1":{"2":{"get_star_ts":"1573765256"},"1":{"get_star_ts":"1573760616"}},"4":{"2":{"get_star_ts":"1573993940"},"1":{"get_star_ts":"1573987479"}},"6":{"1":{"get_star_ts":"1574107994"},"2":{"get_star_ts":"1574147096"}},"3":{"1":{"get_star_ts":"1573826027"},"2":{"get_star_ts":"1573827152"}},"5":{"2":{"get_star_ts":"1574021152"},"1":{"get_star_ts":"1573995867"}},"7":{"1":{"get_star_ts":"1574197009"}},"2":{"2":{"get_star_ts":"1573773372"},"1":{"get_star_ts":"1573768190"}}},"name":"name nbnnbvcb"},"393235":{"local_score":336,"stars":50,"global_score":0,"id":"393235","last_star_ts":"1546638507","completion_day_level":{"12":{"2":{"get_star_ts":"1544611601"},"1":{"get_star_ts":"1544607461"}},"2":{"2":{"get_star_ts":"1543839487"},"1":{"get_star_ts":"1543838455"}},"20":{"2":{"get_star_ts":"1545940671"},"1":{"get_star_ts":"1545940531"}},"15":{"1":{"get_star_ts":"1545255445"},"2":{"get_star_ts":"1545306775"}},"19":{"1":{"get_star_ts":"1545741466"},"2":{"get_star_ts":"1545915725"}},"18":{"2":{"get_star_ts":"1545605808"},"1":{"get_star_ts":"1545603795"}},"9":{"2":{"get_star_ts":"1544443203"},"1":{"get_star_ts":"1544362827"}},"6":{"2":{"get_star_ts":"1544090831"},"1":{"get_star_ts":"1544090372"}},"13":{"1":{"get_star_ts":"1544781604"},"2":{"get_star_ts":"1544959450"}},"5":{"1":{"get_star_ts":"1544007960"},"2":{"get_star_ts":"1544012691"}},"4":{"2":{"get_star_ts":"1543915857"},"1":{"get_star_ts":"1543915751"}},"3":{"2":{"get_star_ts":"1543844810"},"1":{"get_star_ts":"1543844649"}},"1":{"2":{"get_star_ts":"1543828757"},"1":{"get_star_ts":"1543654211"}},"23":{"2":{"get_star_ts":"1546638474"},"1":{"get_star_ts":"1546262133"}},"17":{"2":{"get_star_ts":"1546159136"},"1":{"get_star_ts":"1546159088"}},"25":{"2":{"get_star_ts":"1546638507"},"1":{"get_star_ts":"1546441207"}},"7":{"1":{"get_star_ts":"1544177334"},"2":{"get_star_ts":"1544179024"}},"10":{"2":{"get_star_ts":"1544438249"},"1":{"get_star_ts":"1544438218"}},"8":{"2":{"get_star_ts":"1544273070"},"1":{"get_star_ts":"1544270337"}},"16":{"1":{"get_star_ts":"1545233633"},"2":{"get_star_ts":"1545338402"}},"14":{"2":{"get_star_ts":"1545028942"},"1":{"get_star_ts":"1544986949"}},"11":{"2":{"get_star_ts":"1544520723"},"1":{"get_star_ts":"1544517871"}},"22":{"1":{"get_star_ts":"1546213058"},"2":{"get_star_ts":"1546590986"}},"24":{"2":{"get_star_ts":"1546439078"},"1":{"get_star_ts":"1546433420"}},"21":{"1":{"get_star_ts":"1545947800"},"2":{"get_star_ts":"1546209802"}}},"name":"name fsdf"},"622705":{"stars":1,"global_score":0,"local_score":6,"last_star_ts":"1573741255","completion_day_level":{"1":{"1":{"get_star_ts":"1573741255"}}},"id":"622705","name":"name ffdahlf"}}}';
SELECT A.[event]
,A.owner_id
,B.[key] AS MemberNumber
,C.id
,C.local_score
,C.global_score
,C.stars
,C.[name]
,C.last_star_ts
,D.[key] AS WhatEverNumberThisIs
,E.[key] AS AndWhatEverThisNumberIs
,JSON_VALUE(E.[value],'$.get_star_ts') AS get_star_ts
FROM OPENJSON(@json)
WITH([event] int
,owner_id int
,members NVARCHAR(MAX) AS JSON) A
CROSS APPLY OPENJSON(A.members) B
CROSS APPLY OPENJSON(B.[value])
WITH(local_score int
,stars int
,global_score int
,[name] NVARCHAR(1000)
,id int
,last_star_ts int
,completion_day_level NVARCHAR(MAX) AS JSON ) C
CROSS APPLY OPENJSON(C.completion_day_level) D
CROSS APPLY OPENJSON(D.[value]) E;
简而言之:
我们使用 OPENJSON
的级联。嵌套的 JSON 与 AS JSON
一起返回,可以在下一个 OPENJSON
.