MariaDB JSON_ARRAY_APPEND对象而不是其字符串表示

alen0pnh  于 2023-01-09  发布在  其他
关注(0)|答案(2)|浏览(98)

当我使用JSON_ARRAY_APPEND()插入一个表示对象的字符串时,收到的是一个数组中的带引号的字符串值,而不是对象数组。
我需要一种方法来强制插入到数组中的值成为对象,而不是它的字符串表示。
服务器:10.2.18-玛丽亚数据库日志玛丽亚数据库服务器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"}]}

但我实际上得到:

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

我看到下面的代码是有效的,但是我的约束是value@NewArrayItem是来自另一个应用程序的格式正确的字符串:

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

91zkwejq1#

我使用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;

还在寻找更简单的答案。

nsc4cvqm

nsc4cvqm2#

我尝试这个例子

SET @json = '[]';
SELECT @json; // []
SET @json = JSON_ARRAY_APPEND(@json, '$', JSON_OBJECT("id", 1, "name", "Month1"));
SELECT @json; // [{"id": 1, "name": "Month1"}]
SET @json = JSON_ARRAY_APPEND(@json, '$', JSON_OBJECT("id", 2, "name", "Month2"));
SELECT @json; // [{"id": 1, "name": "Month1"}, {"id": 2, "name": "Month2"}]

相关问题