MySQL8 json 负载不接受 json 字符串作为元素的值

问题描述 投票:0回答:1

我有一个存储过程(请参阅下面的stored_procedure_1代码),它期望将json作为参数传递并将该数据插入到表中。


-- 存储过程_1:

DELIMITER \\

DROP PROCEDURE IF EXISTS my_test_procedure \\

CREATE PROCEDURE my_test_procedure(my_payload JSON)

BEGIN

    INSERT INTO my_test_table (id, ud)
    SELECT jt.id,
           jt.ud
    FROM JSON_TABLE(my_payload, '$[*]' columns (
        id int path '$.id',
        ud json path '$.ud'
        )) AS jt;
END \\

DELIMITER ;

-- 表 DDL:

CREATE TABLE my_test_table
(
    id int,
    ud varchar(255),
    PRIMARY KEY (id)
);

使用以下调用(请参阅下面的 call_1)调用该过程,该调用将 json 字符串作为其中一个元素的值会给出错误(请参阅下面的 error_1 响应)。

-- call_1:

CALL my_test_procedure('[{"id":1,"ud":"{\"1\":5,\"2\":6,\"3\":7}"}]');

-- 错误_1: 错误代码:3140。无效的 JSON 文本:“对象成员后缺少逗号或 '}'。”位于“.my_payload”列值的第 17 位。

使用该值作为 json 进行调用(请参阅下面的 call_2)按预期工作。

-- call_2:

CALL my_test_procedure('[{"id":1,"ud":{\"1\":5,\"2\":6,\"3\":7}}]'); -- OR
CALL my_test_procedure('[{"id":1,"ud":{"1":5,"2":6,"3":7}}]');

在 MySQL 代码中寻找解决方法的建议(考虑传递的有效负载的格式无法更改)。

json stored-procedures json-deserialization mysql-8.0 json-table
1个回答
0
投票

问题在于字符串中

"
的转义;当MySQL解释该字符串时,
\"
被解释为
"
。例如:

SELECT '[{"id":1,"ud":"{\"1\":5,\"2\":6,\"3\":7}"}]'

输出:

[{"id":1,"ud":"{"1":5,"2":6,"3":7}"}]

这不是有效的 JSON。为了在 MySQL 解释时成为有效的 JSON,您需要在

\
:
 之前转义 
"

SELECT '[{"id":1,"ud":"{\\"1\\":5,\\"2\\":6,\\"3\\":7}"}]'

输出:

[{"id":1,"ud":"{\"1\":5,\"2\":6,\"3\":7}"}]

这将适用于您的程序:

CALL my_test_procedure('[{"id":1,"ud":"{\\"1\\":5,\\"2\\":6,\\"3\\":7}"}]');
SELECT *
FROM my_test_table

输出:

id  ud
1   "{\"1\":5,\"2\":6,\"3\":7}"
© www.soinside.com 2019 - 2024. All rights reserved.