MariaDB JSON_ARRAY_APPEND对象,而不是字符串表示形式

时间:2019-11-08 19:24:52

标签: arrays json mariadb

当我使用JSON_ARRAY_APPEND()插入表示对象的字符串时,我在数组而不是对象数组中接收带引号的字符串值。

我需要一种强制将插入数组的值作为对象而不是字符串表示形式的方法。

服务器: 10.2.18-MariaDB日志 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"}]}

但是我实际上得到了:

{"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 :(得分:0)

我通过结合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;

仍在寻找更简单的答案。