0

I'm a little confused about how to parse a JSON string with TSQL. I've been watching Youtube movies for hours, but unfortunately I haven't found a solution yet.

This is the JSONstring:

{"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"}}}

Thanks in advance for the help

4

1 回答 1

2

您的问题没有提供足够的信息。但是您是新用户,我想帮助您解决这个问题。

因此提前一些重要提示

  • 始终说明实际工具(供应商和版本!)。您用 标记了它[tsql],它指向 SQL-Server,但这是不被允许的。对于 JSON 支持,您将需要 SQL-Server v2016+。
  • 尝试创建一个独立的、自运行的示例。我们可以复制并粘贴到我们的机器上,然后单击“运行”。
  • 始终提供预期的输出。
  • 并且请将您的样品减少到所需的最低限度。两个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并可以在 next 中使用OPENJSON

于 2019-11-28T17:18:12.837 回答