使用 OPENJSON 解析
Parsing with OPENJSON
我正在尝试从 GET 调用中获取响应并通过 OPENJSON
将其加载到 SQL 服务器,但我在解析响应时遇到问题。
DECLARE @json NVARCHAR(MAX);
SET @json = N'{
"LookupServiceType": "GetAssetValues",
"Items": [
{
"id": "19676",
"value": "{\"AssetCode\":\"TDAACC\",\"Symbol\":null,\"Issue\":\"ACCOUNT #49\",\"Issuer\":\"TD AMERITRADE\"}"
},
{
"id": "19677",
"value": "{\"AssetCode\":\"RE100\",\"Symbol\":null,\"Issue\":\"APN: 057\",\"Issuer\":\"SAN ANTONIO TX 78212\"}"
},
{
"id": "19908",
"value": "{\"AssetCode\":\"NALIPO\",\"Symbol\":null,\"Issue\":\"POLICY # L0472\",\"Issuer\":\"NATIONWIDE LIFE\"}"
}
]
}';
我尝试了很多变体,但就是做不好。这是我尝试过的一些事情。如有任何建议,我们将不胜感激。
SELECT *
FROM OPENJSON(@json, '$.Items')
WITH (
Items int '$.id',
value NVARCHAR(MAX) '$.value',
AssetCode NVARCHAR(50) '$.value.AssetCode',
Symbol NVARCHAR(50) '$.value.Symbol',
Issue NVARCHAR(50) '$.value.Issue',
Issuer NVARCHAR(50) '$.value.Issuer'
);
SELECT id,AssetCode,Symbol,Issue, Issuer
FROM OPENJSON(@json)
WITH (
Items NVARCHAR(MAX) '$.Items' AS JSON
)
OUTER APPLY OPENJSON(Items)
WITH (
id INT 'strict $.id',
value NVARCHAR(MAX) '$.value' AS JSON
)
OUTER APPLY OPENJSON(value)
WITH (
AssetCode NVARCHAR(50) '$.AssetCode',
Symbol NVARCHAR(50) '$.Symbol',
Issue NVARCHAR(50) '$.Issue',
Issuer NVARCHAR(50) '$.Issuer'
);
问题是您的 JSON 字符串的格式,您有多余的转义符和“”。
清理 JSON 字符串后,您的第一个查询工作正常:
DECLARE @json NVARCHAR(MAX);
SET @json = N'{
"LookupServiceType": "GetAssetValues",
"Items": [
{
"id": "19676",
"value": {"AssetCode":"TDAACC","Symbol":null,"Issue":"ACCOUNT #49","Issuer":"TD AMERITRADE"}
},
{
"id": "19677",
"value": {"AssetCode":"RE100","Symbol":null,"Issue":"APN: 057","Issuer":"SAN ANTONIO TX 78212"}
},
{
"id": "19908",
"value": {"AssetCode":"NALIPO","Symbol":null,"Issue":"POLICY # L0472","Issuer":"NATIONWIDE LIFE"}
}
]
}';
SELECT *
FROM OPENJSON(@json, '$.Items')
WITH (
Items int '$.id',
AssetCode NVARCHAR(50) '$.value.AssetCode',
Symbol NVARCHAR(50) '$.value.Symbol',
Issue NVARCHAR(50) '$.value.Issue',
Issuer NVARCHAR(50) '$.value.Issuer'
);
结果:
Items AssetCode Symbol Issue Issuer
19676 TDAACC NULL ACCOUNT #49 TD AMERITRADE
19677 RE100 NULL APN: 057 SAN ANTONIO TX 78212
19908 NALIPO NULL POLICY # L0472 NATIONWIDE LIFE
或者,如果您不想修复 JSON,您可以使用以下语句:
SELECT *
FROM OPENJSON(REPLACE(REPLACE(Replace(@json, '\', ''), '"{', '{'), '}"', '}'), '$.Items')
WITH (
Items int '$.id',
value NVARCHAR(MAX) '$.value',
AssetCode NVARCHAR(50) '$.value.AssetCode',
Symbol NVARCHAR(50) '$.value.Symbol',
Issue NVARCHAR(50) '$.value.Issue',
Issuer NVARCHAR(50) '$.value.Issuer'
);
我想你正在找这个。 JSON
不需要任何更改
select j1.LookupServiceType, j2.id, j3.AssetCode, j3.Symbol, j3.Issue, j3.Issuer
from
OPENJSON(@json) WITH (LookupServiceType nvarchar(4000),
Items NVARCHAR(MAX) '$.Items' AS JSON) j1
outer APPLY
OPENJSON(Items) WITH (id INT 'strict $.id',
value NVARCHAR(MAX) '$.value' /*AS JSON*/) j2
outer apply
OPENJSON([value]) WITH (AssetCode NVARCHAR(50) '$.AssetCode',
Symbol NVARCHAR(50) '$.Symbol',
Issue NVARCHAR(50) '$.Issue',
Issuer NVARCHAR(50) '$.Issuer') j3;
结果
LookupServiceType id AssetCode Symbol Issue Issuer
GetAssetValues 19676 TDAACC NULL ACCOUNT #49 TD AMERITRADE
GetAssetValues 19677 RE100 NULL APN: 057 SAN ANTONIO TX 78212
GetAssetValues 19908 NALIPO NULL POLICY # L0472 NATIONWIDE LIFE
我正在尝试从 GET 调用中获取响应并通过 OPENJSON
将其加载到 SQL 服务器,但我在解析响应时遇到问题。
DECLARE @json NVARCHAR(MAX);
SET @json = N'{
"LookupServiceType": "GetAssetValues",
"Items": [
{
"id": "19676",
"value": "{\"AssetCode\":\"TDAACC\",\"Symbol\":null,\"Issue\":\"ACCOUNT #49\",\"Issuer\":\"TD AMERITRADE\"}"
},
{
"id": "19677",
"value": "{\"AssetCode\":\"RE100\",\"Symbol\":null,\"Issue\":\"APN: 057\",\"Issuer\":\"SAN ANTONIO TX 78212\"}"
},
{
"id": "19908",
"value": "{\"AssetCode\":\"NALIPO\",\"Symbol\":null,\"Issue\":\"POLICY # L0472\",\"Issuer\":\"NATIONWIDE LIFE\"}"
}
]
}';
我尝试了很多变体,但就是做不好。这是我尝试过的一些事情。如有任何建议,我们将不胜感激。
SELECT *
FROM OPENJSON(@json, '$.Items')
WITH (
Items int '$.id',
value NVARCHAR(MAX) '$.value',
AssetCode NVARCHAR(50) '$.value.AssetCode',
Symbol NVARCHAR(50) '$.value.Symbol',
Issue NVARCHAR(50) '$.value.Issue',
Issuer NVARCHAR(50) '$.value.Issuer'
);
SELECT id,AssetCode,Symbol,Issue, Issuer
FROM OPENJSON(@json)
WITH (
Items NVARCHAR(MAX) '$.Items' AS JSON
)
OUTER APPLY OPENJSON(Items)
WITH (
id INT 'strict $.id',
value NVARCHAR(MAX) '$.value' AS JSON
)
OUTER APPLY OPENJSON(value)
WITH (
AssetCode NVARCHAR(50) '$.AssetCode',
Symbol NVARCHAR(50) '$.Symbol',
Issue NVARCHAR(50) '$.Issue',
Issuer NVARCHAR(50) '$.Issuer'
);
问题是您的 JSON 字符串的格式,您有多余的转义符和“”。
清理 JSON 字符串后,您的第一个查询工作正常:
DECLARE @json NVARCHAR(MAX);
SET @json = N'{
"LookupServiceType": "GetAssetValues",
"Items": [
{
"id": "19676",
"value": {"AssetCode":"TDAACC","Symbol":null,"Issue":"ACCOUNT #49","Issuer":"TD AMERITRADE"}
},
{
"id": "19677",
"value": {"AssetCode":"RE100","Symbol":null,"Issue":"APN: 057","Issuer":"SAN ANTONIO TX 78212"}
},
{
"id": "19908",
"value": {"AssetCode":"NALIPO","Symbol":null,"Issue":"POLICY # L0472","Issuer":"NATIONWIDE LIFE"}
}
]
}';
SELECT *
FROM OPENJSON(@json, '$.Items')
WITH (
Items int '$.id',
AssetCode NVARCHAR(50) '$.value.AssetCode',
Symbol NVARCHAR(50) '$.value.Symbol',
Issue NVARCHAR(50) '$.value.Issue',
Issuer NVARCHAR(50) '$.value.Issuer'
);
结果:
Items AssetCode Symbol Issue Issuer
19676 TDAACC NULL ACCOUNT #49 TD AMERITRADE
19677 RE100 NULL APN: 057 SAN ANTONIO TX 78212
19908 NALIPO NULL POLICY # L0472 NATIONWIDE LIFE
或者,如果您不想修复 JSON,您可以使用以下语句:
SELECT *
FROM OPENJSON(REPLACE(REPLACE(Replace(@json, '\', ''), '"{', '{'), '}"', '}'), '$.Items')
WITH (
Items int '$.id',
value NVARCHAR(MAX) '$.value',
AssetCode NVARCHAR(50) '$.value.AssetCode',
Symbol NVARCHAR(50) '$.value.Symbol',
Issue NVARCHAR(50) '$.value.Issue',
Issuer NVARCHAR(50) '$.value.Issuer'
);
我想你正在找这个。 JSON
不需要任何更改select j1.LookupServiceType, j2.id, j3.AssetCode, j3.Symbol, j3.Issue, j3.Issuer
from
OPENJSON(@json) WITH (LookupServiceType nvarchar(4000),
Items NVARCHAR(MAX) '$.Items' AS JSON) j1
outer APPLY
OPENJSON(Items) WITH (id INT 'strict $.id',
value NVARCHAR(MAX) '$.value' /*AS JSON*/) j2
outer apply
OPENJSON([value]) WITH (AssetCode NVARCHAR(50) '$.AssetCode',
Symbol NVARCHAR(50) '$.Symbol',
Issue NVARCHAR(50) '$.Issue',
Issuer NVARCHAR(50) '$.Issuer') j3;
结果
LookupServiceType id AssetCode Symbol Issue Issuer
GetAssetValues 19676 TDAACC NULL ACCOUNT #49 TD AMERITRADE
GetAssetValues 19677 RE100 NULL APN: 057 SAN ANTONIO TX 78212
GetAssetValues 19908 NALIPO NULL POLICY # L0472 NATIONWIDE LIFE