在 sql 服务器中使用 OpenJson() 序列化反序列化的对象
Serialize an object deserialized using OpenJson() in sql server
我想将我使用 OPENJSON()
反序列化的对象序列化回来。我在 SQL 服务器中存储为 NVARCHAR
.
{
"Name":"Name1",
"Everyday":false,
"EveryWeek":true,
"RecurRange":"12-Apr-2022-Sep-2022"
}
为了使用 OPENJSON()
替换 Name 字段,我反序列化,存储在一个临时的 table 中,键、值作为列,更新了 Name。
现在我想将 table 序列化回初始格式。尝试使用 FOR JSON AUTO
:
进行转换
CREATE TABLE #InfoTable([Key] NVARCHAR(MAX),Value NVARCHAR(MAX),Type INT)
INSERT INTO #InfoTable SELECT * FROM OpenJson(@jsondata)
UPDATE #InfoTable SET Value = 'NewName' WHERE [Key] = 'Name'
DECLARE @NewJson NVARCHAR(MAX) = (select * FROM #InfoTable FOR JSON AUTO)
但似乎不起作用:
[
{"Key":"Name","Value":"NewName","Type":1},
{"Key":"Everyday","Value":"false","Type":3},
{"Key":"EveryWeek","Value":"true","Type":2},
{"Key":"RecurRange","Value":"18-Apr-2022-May-2022","Type":1}
]
有没有办法将返回的 OpenJson table 转换回字符串?
如果要修改单个 JSON 对象中的键的值,您需要 JSON_MODIFY()
:
DECLARE @jsondata nvarchar(max) = N'{"Name":"Name1","Everyday":false,"EveryWeek":true,"RecurRange":"12-Apr-2022-Sep-2022"}'
SELECT @jsondata = JSON_MODIFY(
@jsondata,
'$.Name',
'NewName'
)
SELECT @jsondata
如果您想使用当前的方法,您需要使用具有显式模式的OPENJSON()
:
DECLARE @jsondata nvarchar(max) = N'{"Name":"Name1","Everyday":false,"EveryWeek":true,"RecurRange":"12-Apr-2022-Sep-2022"}'
SELECT *
INTO #InfoTable
FROM OPENJSON(@jsondata) WITH (
Name nvarchar(max),
Everyday bit,
EveryWeek bit,
RecurRange nvarchar(max)
)
UPDATE #InfoTable
SET Name = 'NewName'
DECLARE @newjson NVARCHAR(MAX) = (
SELECT *
FROM #InfoTable
FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER
)
SELECT @newjson
最后,正如@Charlieface 所建议的,您可以使用 FOR JSON PATH
:
来简化语句
DECLARE @jsondata nvarchar(max) = N'{"Name":"Name1","Everyday":false,"EveryWeek":true,"RecurRange":"12-Apr-2022-Sep-2022"}'
SELECT @jsondata = (
SELECT 'NewName' AS Name, Everyday, EveryWeek, RecurRange
FROM OPENJSON(@jsondata) WITH (
Name nvarchar(max),
Everyday bit,
EveryWeek bit,
RecurRange nvarchar(max)
)
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
)
我想将我使用 OPENJSON()
反序列化的对象序列化回来。我在 SQL 服务器中存储为 NVARCHAR
.
{
"Name":"Name1",
"Everyday":false,
"EveryWeek":true,
"RecurRange":"12-Apr-2022-Sep-2022"
}
为了使用 OPENJSON()
替换 Name 字段,我反序列化,存储在一个临时的 table 中,键、值作为列,更新了 Name。
现在我想将 table 序列化回初始格式。尝试使用 FOR JSON AUTO
:
CREATE TABLE #InfoTable([Key] NVARCHAR(MAX),Value NVARCHAR(MAX),Type INT)
INSERT INTO #InfoTable SELECT * FROM OpenJson(@jsondata)
UPDATE #InfoTable SET Value = 'NewName' WHERE [Key] = 'Name'
DECLARE @NewJson NVARCHAR(MAX) = (select * FROM #InfoTable FOR JSON AUTO)
但似乎不起作用:
[
{"Key":"Name","Value":"NewName","Type":1},
{"Key":"Everyday","Value":"false","Type":3},
{"Key":"EveryWeek","Value":"true","Type":2},
{"Key":"RecurRange","Value":"18-Apr-2022-May-2022","Type":1}
]
有没有办法将返回的 OpenJson table 转换回字符串?
如果要修改单个 JSON 对象中的键的值,您需要 JSON_MODIFY()
:
DECLARE @jsondata nvarchar(max) = N'{"Name":"Name1","Everyday":false,"EveryWeek":true,"RecurRange":"12-Apr-2022-Sep-2022"}'
SELECT @jsondata = JSON_MODIFY(
@jsondata,
'$.Name',
'NewName'
)
SELECT @jsondata
如果您想使用当前的方法,您需要使用具有显式模式的OPENJSON()
:
DECLARE @jsondata nvarchar(max) = N'{"Name":"Name1","Everyday":false,"EveryWeek":true,"RecurRange":"12-Apr-2022-Sep-2022"}'
SELECT *
INTO #InfoTable
FROM OPENJSON(@jsondata) WITH (
Name nvarchar(max),
Everyday bit,
EveryWeek bit,
RecurRange nvarchar(max)
)
UPDATE #InfoTable
SET Name = 'NewName'
DECLARE @newjson NVARCHAR(MAX) = (
SELECT *
FROM #InfoTable
FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER
)
SELECT @newjson
最后,正如@Charlieface 所建议的,您可以使用 FOR JSON PATH
:
DECLARE @jsondata nvarchar(max) = N'{"Name":"Name1","Everyday":false,"EveryWeek":true,"RecurRange":"12-Apr-2022-Sep-2022"}'
SELECT @jsondata = (
SELECT 'NewName' AS Name, Everyday, EveryWeek, RecurRange
FROM OPENJSON(@jsondata) WITH (
Name nvarchar(max),
Everyday bit,
EveryWeek bit,
RecurRange nvarchar(max)
)
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
)