我的问题是当我尝试使用mysql函数JSON_EXTRACT获取数据时,问题是我使用索引[0]进行操作,并且一切正常,但是当我要求下一个[1]时,返回null。我试过没有索引来知道如何搜索,并且返回了我所有的json数据,当我尝试在0位置上建立索引位置时,不返回任何数据,只是返回null。这是我的示例代码:
set @example = '{"product":{
"id_product":1,
"quantity":1
},
"product":{
"id_product":3,
"quantity":4
},
"product":{
"id_product":5,
"quantity":2
}
}';
select JSON_EXTRACT(@example, '$.product[0].id_product'); -- Returns '1'
select JSON_EXTRACT(@example, '$.product[1].id_product'); -- Returns null, should be '3'
我想知道如果不是真的这样使用的话。
预先感谢。
答案 0 :(得分:0)
最后一次重复赢得密钥。
11.6 The JSON Data Type :: Normalization, Merging, and Autowrapping of JSON Values
...
RFC 7159建议这种“最后的重复密钥获胜”行为,并且大多数JavaScript都实现了这种行为。 解析器。
...
在8.0.3之前的MySQL版本中,具有与文档较早版本中的键重复的键的成员将被丢弃。
...
示例:
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.0.15 |
+-----------+
1 row in set (0.00 sec)
mysql> SET @`example` := '{
'> "product": {
'> "id_product": 1,
'> "quantity": 1
'> },
'> "product": {
'> "id_product": 3,
'> "quantity": 4
'> },
'> "product": {
'> "id_product": 5,
'> "quantity": 2
'> }
'> }';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT JSON_VALID(@`example`);
+------------------------+
| JSON_VALID(@`example`) |
+------------------------+
| 1 |
+------------------------+
1 row in set (0.01 sec)
mysql> SELECT JSON_LENGTH(@`example`);
+-------------------------+
| JSON_LENGTH(@`example`) |
+-------------------------+
| 1 |
+-------------------------+
1 row in set (0.00 sec)
mysql> SELECT JSON_EXTRACT(@`example`, '$.product');
+---------------------------------------+
| JSON_EXTRACT(@`example`, '$.product') |
+---------------------------------------+
| {"quantity": 2, "id_product": 5} |
+---------------------------------------+
1 row in set (0.00 sec)
某些选项
选项0 :
mysql> SET @`example` := '{
'> "product_0": {
'> "id_product": 1,
'> "quantity": 1
'> },
'> "product_1": {
'> "id_product": 3,
'> "quantity": 4
'> },
'> "product_2": {
'> "id_product": 5,
'> "quantity": 2
'> }
'> }';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT JSON_VALID(@`example`);
+------------------------+
| JSON_VALID(@`example`) |
+------------------------+
| 1 |
+------------------------+
1 row in set (0.00 sec)
mysql> SELECT JSON_LENGTH(@`example`);
+-------------------------+
| JSON_LENGTH(@`example`) |
+-------------------------+
| 3 |
+-------------------------+
1 row in set (0.00 sec)
mysql> SELECT
-> JSON_EXTRACT(@`example`, '$.product_0.id_product'),
-> JSON_EXTRACT(@`example`, '$.product_1.id_product'),
-> JSON_EXTRACT(@`example`, '$.product_2.id_product')\G
*************************** 1. row ***************************
JSON_EXTRACT(@`example`, '$.product_0.id_product'): 1
JSON_EXTRACT(@`example`, '$.product_1.id_product'): 3
JSON_EXTRACT(@`example`, '$.product_2.id_product'): 5
1 row in set (0.00 sec)
选项1 :
mysql> SET @`example` := '[
'> {
'> "product": {
'> "id_product": 1,
'> "quantity": 1
'> }
'> },
'> {
'> "product": {
'> "id_product": 3,
'> "quantity": 4
'> }
'> },
'> {
'> "product": {
'> "id_product": 5,
'> "quantity": 2
'> }
'> }]';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT JSON_VALID(@`example`);
+------------------------+
| JSON_VALID(@`example`) |
+------------------------+
| 1 |
+------------------------+
1 row in set (0.00 sec)
mysql> SELECT JSON_LENGTH(@`example`);
+-------------------------+
| JSON_LENGTH(@`example`) |
+-------------------------+
| 3 |
+-------------------------+
1 row in set (0.00 sec)
mysql> SELECT
-> JSON_EXTRACT(@`example`, '$[0].product.id_product'),
-> JSON_EXTRACT(@`example`, '$[1].product.id_product'),
-> JSON_EXTRACT(@`example`, '$[2].product.id_product')\G
*************************** 1. row ***************************
JSON_EXTRACT(@`example`, '$[0].product.id_product'): 1
JSON_EXTRACT(@`example`, '$[1].product.id_product'): 3
JSON_EXTRACT(@`example`, '$[2].product.id_product'): 5
1 row in set (0.00 sec)