T-SQL 在 SQL 服务器中解析没有 属性 名称的 JSON 数组
T-SQL parse JSON array without property name in SQL Server
环境
- SQL 服务器 2016
- Windows 2016
我目前正在从 API 获取信息。当我调用此 API 时,我收到以下 JSON 文本:
{"request":{"command":"series","series_id":"342"},"series":[{"series_id":"342","data":[["2023",125.39355],["2022",122.85654167],["2021",118.36935],["2020",113.74025],["2019",112.27875],["2018",110.3265],["2017",107.742],["2016",105.70325],["2015",104.6615],["2014",103.6625],["2013",101.76875],["2012",100.00025],["2011",98.15725],["2010",96.16425],["2009",95.019],["2008",94.39725],["2007",92.65325],["2006",90.2115],["2005",87.49],["2004",84.84175],["2003",82.63525],["2002",81.01275],["2001",79.8145],["2000",78.01625],["1999",76.27275],["1998",75.2195],["1997",74.39925],["1996",73.13225],["1995",71.819],["1994",70.342],["1993",68.87425],["1992",67.27775],["1991",65.77725],["1990",63.63575]]}]}'
问题
我尝试将数据数组解析为两列,'Years' 和 'Value'。我不关心其他任何事情。我不确定如何解析这个 Json 字符串。我最近的尝试是
DECLARE @json nvarchar(max) = N'*<api data from above>*'
SELECT
AllData --AllData,Replace(Replace(Replace(AllData, '"',''),'[',''),']','')
FROM
OPENJSON(@json)
WITH (
data NVARCHAR(Max) '$.request.series.data' AS JSON
)
OUTER APPLY
OPENJSON(data)
WITH (AllData VARCHAR(50) '$.request.series.data')
我尝试了很多不同的路线(例如 $.data、$.series.data 等)都无济于事。目前,如果我可以将数据数组恢复为单个列(例如 2023、123.39.355;2022、122.85;等),我可以轻松地从那里解析为两列(因此注释掉了 Replace 函数),但我返回为空。
有什么想法吗?
select *
from openjson(@json, '$.series[0].data')
with
(
year smallint '$[0]',
value decimal(20, 10) '$[1]'
);
环境
- SQL 服务器 2016
- Windows 2016
我目前正在从 API 获取信息。当我调用此 API 时,我收到以下 JSON 文本:
{"request":{"command":"series","series_id":"342"},"series":[{"series_id":"342","data":[["2023",125.39355],["2022",122.85654167],["2021",118.36935],["2020",113.74025],["2019",112.27875],["2018",110.3265],["2017",107.742],["2016",105.70325],["2015",104.6615],["2014",103.6625],["2013",101.76875],["2012",100.00025],["2011",98.15725],["2010",96.16425],["2009",95.019],["2008",94.39725],["2007",92.65325],["2006",90.2115],["2005",87.49],["2004",84.84175],["2003",82.63525],["2002",81.01275],["2001",79.8145],["2000",78.01625],["1999",76.27275],["1998",75.2195],["1997",74.39925],["1996",73.13225],["1995",71.819],["1994",70.342],["1993",68.87425],["1992",67.27775],["1991",65.77725],["1990",63.63575]]}]}'
问题
我尝试将数据数组解析为两列,'Years' 和 'Value'。我不关心其他任何事情。我不确定如何解析这个 Json 字符串。我最近的尝试是
DECLARE @json nvarchar(max) = N'*<api data from above>*'
SELECT
AllData --AllData,Replace(Replace(Replace(AllData, '"',''),'[',''),']','')
FROM
OPENJSON(@json)
WITH (
data NVARCHAR(Max) '$.request.series.data' AS JSON
)
OUTER APPLY
OPENJSON(data)
WITH (AllData VARCHAR(50) '$.request.series.data')
我尝试了很多不同的路线(例如 $.data、$.series.data 等)都无济于事。目前,如果我可以将数据数组恢复为单个列(例如 2023、123.39.355;2022、122.85;等),我可以轻松地从那里解析为两列(因此注释掉了 Replace 函数),但我返回为空。
有什么想法吗?
select *
from openjson(@json, '$.series[0].data')
with
(
year smallint '$[0]',
value decimal(20, 10) '$[1]'
);