MariaDB JSON_ARRAY_APPEND Объект вместо его строкового представления - PullRequest
0 голосов
/ 08 ноября 2019

Я получаю заключенные в кавычки строковые значения в массиве вместо массива объектов, когда я использую JSON_ARRAY_APPEND () для вставки строки, представляющей объект.

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

Сервер: 10.2.18-MariaDB-log MariaDB Сервер Linux x86_64

Вот пример, который я пытаюсь получить:

set @NewArrayItem = '{"item2": "value2"}';
SELECT JSON_ARRAY_APPEND('{"SomeData": "SomeValue", "AnArray": [{"item1": "value1"}]}', '$.AnArray', @NewArrayItem ) as outval;

Второй элемент в массиве ($ .AnArray [1]) - это строка вместо объекта.

Я ожидаю:

{"SomeData": "SomeValue", "AnArray": [{"item1": "value1"}, {"item2": "value2"}]}

Но я на самом делеget:

{"SomeData": "SomeValue", "AnArray": [{"item1": "value1"}, "{\"item2\": \"value2\"}"]}

Я вижу, что работает следующее, но я ограничен тем, что значение @NewArrayItem является правильно отформатированной строкой из другого приложения:

SELECT JSON_ARRAY_APPEND('{"SomeData": "SomeValue", "AnArray": [{"item1": "value1"}]}', '$.AnArray', JSON_OBJECT('item2','value2') ) as outval;

1 Ответ

0 голосов
/ 08 ноября 2019

Я решил это с помощью комбинации JSON_SET, JSON_MERGE и JSON_QUERY:

set @ExistingData = '{"SomeData": "SomeValue", "AnArray": [{"item1": "value1"}]}';
set @NewArrayItem = '{"item2": "value2"}';
SELECT JSON_SET(@ExistingData, '$.AnArray', JSON_MERGE(ifnull(JSON_QUERY(@ExistingData, '$.AnArray'),'[]'),@NewArrayItem) ) as outval;

В качестве бонуса, это также работает для случая, когда массив не существует:

set @ExistingData = '{"SomeData": "SomeValue"}';
set @NewArrayItem = '{"item2": "value2"}';
SELECT JSON_SET(@ExistingData, '$.AnArray', JSON_MERGE(ifnull(JSON_QUERY(@ExistingData, '$.AnArray'),'[]'),@NewArrayItem) ) as outval;

Все еще ищу более простой ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...