MySQL在更新期间将我的JSON对象解释为字符串

问题描述 投票:3回答:2

我有一个可以为JSON类型的可空列:

CREATE TABLE mytable (mycolumn JSON);

我想要做的是跟踪数组中的事件,并将每个事件保存在此数组中的对象形式中。三个事件被推入阵列后,所需的mycolumn内容将是:

[
  {"product": ["book"], "subgenre": ["scifi"], "genre": ["fiction"]},
  {"product": ["book"], "subgenre": ["space"], "genre": ["fiction"]},
  {"product": ["book"], "genre": ["romance"]},
] 

对象的形状是无关紧要和未知的(以上只是示例)。唯一已知的是每个事件都是一个至少有一个属性的对象。属性是数组,对象,标量,字符串或null是未知的。

该列最初将为null,我的测试显示我需要将其合并为一个数组或推入它将失败。

我最接近完成这项工作的是:

UPDATE
  mytable
SET
  mycolumn = JSON_ARRAY_APPEND (
    COALESCE (mycolumn, '[]'),
    '$',
    (
      '{"product": ["book"], "subgenre": ["scifi"], "genre": ["fiction"], "type": ["newrelease"]}'
    )
  );

问题是这个查询将整个对象解释为一个字符串,我最终得到一个字符串数组而不是一个对象数组:

SELECT mycolumn FROM mytable;

[
    "{\"product\":[\"book\"],\"subgenre\":[\"scifi\"],\"genre\":[\"fiction\"]}",
    "{\"product\":[\"book\"],\"subgenre\":[\"space\"],\"genre\":[\"fiction\"]}",
    "{\"product\":[\"book\"],\"genre\":[\"romance\"]}"
]
mysql sql arrays mysql-5.7
2个回答
1
投票

在我看来你想要使用像JSON_MERGE_PRESERVE函数,而不是JSON_ARRAY_APPEND函数。

后者将第三个参数作为值进行评估,它不会将第三个参数作为JSON文档进行评估。

在所示的UPDATE声明中,围绕第三个参数(对JSON_ARRAY_APPEND)的虚假parens没有任何意义。第三个参数只是一个值。该值是一个看起来像JSON的长字符串,但在这种情况下,它只是一个字符串。

参考:https://dev.mysql.com/doc/refman/8.0/en/json-modification-functions.html#function_json-array-append


我建议测试和开发表达式...使用SELECT语句更容易,更快捷。一旦我们有表达式返回预期/期望的结果,那么我们可以将表达式移动到UPDATE语句中。


-1
投票
cast('{"product": ["book"], "subgenre": ["scifi"], "genre": ["fiction"], "type": ["newrelease"]}' as json)

这是一个类似的问题:

MySQL append json object to array of json objects

© www.soinside.com 2019 - 2024. All rights reserved.