Я хочу сериализовать обратно объект, который я десериализовал с помощью OPENJSON()
. Я храню ниже объект в SQL Server как NVARCHAR
.
{
"Name":"Name1",
"Everyday":false,
"EveryWeek":true,
"RecurRange":"12-Apr-2022$12-Sep-2022"
}
Чтобы заменить поле имени с помощью OPENJSON()
, я десериализовал обратно, сохранил во временной таблице ключ, значение в виде столбцов, обновил имя.
Теперь я хочу сериализовать эту таблицу в исходный формат. Пробовал конвертировать с помощью 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$14-May-2022","Type":1}
]
Есть ли способ преобразовать возвращаемую таблицу OpenJson обратно в строку?
Если вы хотите изменить значение ключа в одном объекте JSON, вам нужно JSON_MODIFY()
:
DECLARE @jsondata nvarchar(max) = N'{"Name":"Name1","Everyday":false,"EveryWeek":true,"RecurRange":"12-Apr-2022$12-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$12-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$12-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
)
Спасибо, чувак, это работает. Не знал о JSON_MODIFY()
@MuhammedYaseen Версия OPENJSON
даже не нуждается во временной таблице, вы можете просто сделать SELECT Name = 'NewName', ... FROM OPENJSON ...
Почему бы вообще не использовать
JSON_MODIFY
вместо десериализации? Это также позволяет избежать проблем с сериализацией назад.