Как с помощью JSON_MODIFY () добавить строку в путь root, если ее имя неизвестно или не указано? - PullRequest
1 голос
/ 16 июня 2020

Я хочу добавить к root строки JSON, когда не указан другой root или его имя неизвестно. К сожалению, необходимо указать другой root узел , прежде чем я смогу добавить еще один JSON узел. Как мне добавить дополнительные структуры JSON, если другой root не указан или его имя root неизвестно?

Сначала я начинаю с пустого объекта / строки JSON. JSON_MODIFY() не может работать с пустой строкой '':

declare @jsonResponse nvarchar(max) = '{}';

Затем я заполняю ответ:

select @jsonResponse = (
        select
            'stuff' as colA
            ,'stuff' as colB
            ,'stuff' as colC
        for json path, INCLUDE_NULL_VALUES 
);

Если я попытаюсь ДОБАВИТЬ к @jsonResponse вот так:

set @jsonResponse =  json_modify(@jsonResponse, 'append $."Added Stuff"', 'some more stuff'); --no error, but no append
--set @jsonResponse =  json_modify(@jsonResponse, 'append $.[0]', 'some more stuff'); --error
--set @jsonResponse =  json_modify(@jsonResponse, 'append $[0]', 'some more stuff'); --no error, but no append
--set @jsonResponse =  json_modify(@jsonResponse, 'append [0].$', 'some more stuff'); --error
--set @jsonResponse =  json_modify(@jsonResponse, 'append [0]$', 'some more stuff'); --error

Ничего из этого не работает . Единственный, который не вызывает ошибки, - это первый и третий пример 'append $."Added Stuff"'. Это все, что я получаю:

[{"colA":"stuff","colB":"stuff","colC":"stuff"}]

ОДНАКО Если я укажу путь root в моем исходном операторе выбора (что нежелательно), ТОГДА Я смогу добавить другие JSON структуры позже:

select @jsonResponse = (

        select
            'stuff' as colA
            ,'stuff' as colB
            ,'stuff' as colC
        for json path, root('root'), INCLUDE_NULL_VALUES 

)

set @jsonResponse =  json_modify(@jsonResponse, 'append $."Added Stuff"', 'some more stuff')

Результат:

{"root":[{"colA":"stuff","colB":"stuff","colC":"stuff"}],"Added Stuff":["some more stuff"]}

== ЖЕЛАЕМЫЙ РЕЗУЛЬТАТ ==

Я хочу добавить содержимое к моей строке JSON по желанию, даже если в этой строке нет root [{"key":"val"}] или его root неизвестно {"RootNameUnknown": []}, или это пустой объект {}.

Я не могу (или не знаю, как) добавить к предварительно установленной строке JSON, если в ней уже нет root и одного из корни известны. Другая проблема заключается в том, что вы не можете изменить строку JSON, если предварительно не установили ее как {}

. Таким образом, желаемый результат может выглядеть примерно так:

{
"SomeRoot": [
    {
        "colA": "stuff",
        "colB": "stuff",
        "colC": "stuff"
    }
],
"ExampleAppend1": [
    "content"
],
"ExampleAppend2": [
    {
        "speedracer": "go"
    }
]
}

1 Ответ

0 голосов
/ 16 июня 2020

Пояснения:

Я не уверен, что это точный ответ на ваш вопрос, но он слишком длинный для комментария. Важно отметить, что FOR JSON PATH возвращает различное содержимое JSON в зависимости от параметров ROOT и WITHOUT_ARRAY_WRAPPER. В следующей таблице показан другой вывод JSON:

-----------------------------------------------------------------------------------------------------       
|Statement                              | Result                                                    |
-----------------------------------------------------------------------------------------------------       
| SELECT                                | [{"colA":"stuff","colB":"stuff","colC":"stuff"}]          |
|   'stuff' AS colA,                    | JSON array                                                | 
|   'stuff' AS colB,                    |                                                           |
|   'stuff' AS colC                     |                                                           |
| FOR JSON PATH                         |                                                           |
-----------------------------------------------------------------------------------------------------       
| SELECT                                | {"colA":"stuff","colB":"stuff","colC":"stuff"}            |
|   'stuff' AS colA,                    | JSON object                                               | 
|   'stuff' AS colB,                    |                                                           |
|   'stuff' AS colC                     |                                                           |
| FOR JSON PATH, WITHOUT_ARRAY_WRAPPER  |                                                           |
-----------------------------------------------------------------------------------------------------       
| SELECT                                | {"root":[{"colA":"stuff","colB":"stuff","colC":"stuff"}]} |
|   'stuff' AS colA,                    | JSON object                                               | 
|   'stuff' AS colB,                    |                                                           |
|   'stuff' AS colC                     |                                                           |
| FOR JSON PATH, ROOT('root')           |                                                           |
-----------------------------------------------------------------------------------------------------       

Итак, если вы хотите добавить содержимое в строку JSON, используя JSON_MODIFY(), вам необходимо использовать соответствующую комбинацию path выражение и модификатор append.

Добавить содержимое к JSON тексту, созданному с помощью FOR JSON PATH:

DECLARE @jsonResponse nvarchar(max)
SELECT @jsonResponse = (
   SELECT 'stuff' AS colA, 'stuff' AS colB, 'stuff' AS colC
   FOR JSON PATH
)
SELECT @jsonResponse = JSON_MODIFY(
   @jsonResponse,
   'append $',
   'some more stuff'
)

Результат:

[{"colA":"stuff","colB":"stuff","colC":"stuff"},"some more stuff"]

Добавить содержимое в текст JSON, созданный с помощью модификаторов FOR JSON PATH, WITHOUT_ARRAY_WRAPPER и append :

DECLARE @jsonResponse nvarchar(max)
SELECT @jsonResponse = (
   SELECT 'stuff' AS colA, 'stuff' AS colB, 'stuff' AS colC
   FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
)
SELECT @jsonResponse = JSON_MODIFY(
   @jsonResponse,
   'append $."Added Stuff"',
   'some more stuff'
)

Результат:

{"colA":"stuff","colB":"stuff","colC":"stuff","Added Stuff":["some more stuff"]}

Добавить содержимое к JSON тексту, созданному с FOR JSON PATH, WITHOUT_ARRAY_WRAPPER и без модификатора append :

DECLARE @jsonResponse nvarchar(max)
SELECT @jsonResponse = (
   SELECT 'stuff' AS colA, 'stuff' AS colB, 'stuff' AS colC
   FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
)
SELECT @jsonResponse = JSON_MODIFY(
   @jsonResponse,
   '$."Added Stuff"',
   'some more stuff'
)

Результат:

{"colA":"stuff","colB":"stuff","colC":"stuff","Added Stuff":"some more stuff"}

Добавить содержимое к JSON тексту, созданному с помощью FOR JSON PATH и ROOT:

DECLARE @jsonResponse nvarchar(max)
SELECT @jsonResponse = (
   SELECT 'stuff' AS colA, 'stuff' AS colB, 'stuff' AS colC
   FOR JSON PATH, ROOT('root')
)
SELECT @jsonResponse = JSON_MODIFY(
   @jsonResponse,
   'append $."Added Stuff"',
   'some more stuff'
)

Результат:

{"root":[{"colA":"stuff","colB":"stuff","colC":"stuff"}],"Added Stuff":["some more stuff"]}
...