Extraire des valeurs d'un json
Bonjour
J'ai cherché toute la matinée mais je n'avance pas sur le sujet.
Je cherche à passer un json à une procédure et à traiter les différentes valeurs reçues.
Pour le moment, ma procédure est:
Code:
1 2 3 4 5
|
create procedure `test_js`(in `arg1` json)
begin
select `arg1`->'$.liste[0]';
end; |
Je teste le code de la façon suivante:
Code:
1 2 3
|
set @js = '{"liste":[{"nom":"Français","valeurs":[1,1]},{"nom":"Anglais","valeurs":[2,1]}]}';
call test_js(@js); |
Résultat affiché: {"nom": "Français", "valeurs": [1, 1]}
Jusque là, tout va bien !
Ce que je voudrais c'est récupérer chaque valeur du tableau "liste" sans connaître le nombre d'éléments du tableau.
Ici, il y en a 2 mais potentiellement plusieurs dans d'autres cas.
Le but est d'insérer plusieurs lignes dans une table à partir des valeurs de chaque ligne.
Pour chaque ligne je voudrai obtenir les valeurs de nom et les valeurs du tableau dans des variables.
Et là, je sèche. J'ai beau chercher sur le net, je ne trouve pas le bon tuto ou la bonne doc qui me dise comment faire.
Quelqu'un ici pourrait-il me donner une piste svp ?
...
Bon, à force d'acharnement :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
use `import_modulr`;
truncate table `test`;
set @t = '{
"liste": [
{
"nom": "Français",
"valeurs": [1, 1, 1]
},
{
"nom": "Anglais",
"valeurs": [2, 1, 0]
}
]
}';
call test_json_proc(@t);
select * from `test` `t`; |
et la procédure
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
create
definer = `root`@`%` procedure `test_json_proc`(in `values_list` json)
begin
declare `t` int default 0;
declare `line` json;
declare `elem` json;
set @`total` = json_length(`values_list` -> '$.liste');
repeat
set `line` = json_remove(`values_list` -> '$.liste', concat('$[', `t`, ']'));
set `elem` = `line` -> '$[0]';
insert into `test`
values (`elem` ->> '$.nom', `elem` -> '$.valeurs[0]', `elem` -> '$.valeurs[1]', `elem` -> '$.valeurs[2]');
set `t` = `t` + 1;
until `t` = @`total` end repeat;
end; |
et le résultat
value;list_id;disp;position
"Anglais";"2";"1";"0"
"Français";"1";"1";"1"