Сериализовать объект, десериализованный с помощью OpenJson() на сервере sql

Я хочу сериализовать обратно объект, который я десериализовал с помощью 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_MODIFY вместо десериализации? Это также позволяет избежать проблем с сериализацией назад.

Jeroen Mostert 16.05.2022 12:59
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
1
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите изменить значение ключа в одном объекте 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()

Muhammed Yaseen 16.05.2022 13:26

@MuhammedYaseen Версия OPENJSON даже не нуждается во временной таблице, вы можете просто сделать SELECT Name = 'NewName', ... FROM OPENJSON ...

Charlieface 16.05.2022 16:38

Другие вопросы по теме