GET_JSON_OBJECT extrait une valeur de données JSON à partir d’un chemin JSON spécifié.
Syntaxe
STRING GET_JSON_OBJECT(JSON|STRING <json>, STRING <json_path>)
Exemple : Renvoie Alice.
SELECT GET_JSON_OBJECT(JSON '{"name": "Alice", "age": 30}', '$.name');
Paramètres
json (obligatoire)
Données JSON à traiter. Deux types d’entrée sont acceptés :
JSON type : Valeur du type de données JSON, par exemple
JSON '{"name": "Alice", "age": 30}'.-
Type STRING : Chaîne au format JSON, telle que
'{"name": "Alice", "age": 30}'. Les entrées de type chaîne doivent respecter les exigences suivantes :Format :
'{"Key":"Value", "Key":"Value",...}'Échappez les guillemets doubles (
") avec deux barres obliques inverses (\\).Échappez les apostrophes (
') avec une barre oblique inverse (\).
json_path (obligatoire)
Chaîne STRING spécifiant l’expression du chemin JSON. Le chemin doit commencer par $. Les caractères suivants sont pris en charge :
|
Caractère |
Description |
Exemple |
|
|
Nœud racine |
|
|
|
Nœud enfant (pour les objets JSON) |
|
|
|
Nœud enfant (syntaxe alternative ; requis lorsque la clé JSON contient un point) |
|
|
|
Indice de tableau, à partir de 0 |
|
|
|
Joker : renvoie tous les éléments d’un tableau ; ne peut pas être échappé |
|
La notation['']nécessiteSET odps.sql.udf.getjsonobj.new=true;.
Syntaxe de chemin JSON non prise en charge
GET_JSON_OBJECT ne prend pas en charge la syntaxe des expressions régulières dans les chemins JSON.
La syntaxe de chemin JSON pour le type de données JSON diffère de la spécification basée sur STRING et peut entraîner des problèmes de compatibilité.
Valeur de retour
Renvoie une chaîne STRING. La valeur de retour dépend de l’entrée :
|
Condition |
Valeur de retour |
|
|
Valeur extraite sous forme de chaîne |
|
|
NULL |
|
|
NULL |
|
|
Chaîne non tableau par défaut |
Pour forcer les résultats [*] dans un format de tableau unifié, exécutez SET odps.sql.force.getjsonobj.array.format=true;.
Comportement de retour
GET_JSON_OBJECT présente deux comportements de retour contrôlés par l’indicateur odps.sql.udf.getjsonobj.new. Définissez-le au niveau de la session ou du projet.
|
Scénario |
new=true (recommandé) |
new=false |
|
Sortie de chaîne |
Renvoie la chaîne d’origine sans modification |
Échappe les caractères réservés JSON (par exemple, |
|
Clés JSON en double |
Analyse réussie, renvoie la première correspondance |
Renvoie NULL |
|
Ordre de sortie des clés |
Conserve l’ordre JSON d’origine |
Ordre alphabétique |
Nous vous recommandons d’utiliser SET odps.sql.udf.getjsonobj.new=true; pour un comportement plus standard, un traitement des données simplifié et des performances améliorées. Si votre projet MaxCompute comporte des tâches existantes qui dépendent du comportement d’échappement des caractères réservés JSON, continuez à utiliser le comportement d’origine jusqu’à ce que vous ayez vérifié que le changement ne provoque ni erreurs ni problèmes d’exactitude.
Exemple : Vérifier le comportement actuel de votre projet
SELECT GET_JSON_OBJECT('{"a":"[\\"1\\"]"}', '$.a');
-- Behavior: escape JSON reserved characters → returns [\"1\"]
-- Behavior: preserve original string → returns ["1"]
Comportement par défaut selon la date de création du projet
Projets créés le 21 janvier 2021 ou après : conservent les chaînes d’origine (comportement
new=true)Projets créés avant le 21 janvier 2021 : échappent les caractères réservés JSON (comportement
new=false)
Pour basculer le paramètre par défaut de votre projet vers la conservation des chaînes d’origine sans définir l’indicateur dans chaque session, soumettez un ticket.
L’activation du mode de compatibilité Hive (SET odps.sql.hive.compatible=true;) conserve également les chaînes d’origine.
Remarques sur l'utilisation
Performance : évitez d’appeler GET_JSON_OBJECT plusieurs fois sur le même JSON
Chaque appel analyse indépendamment la chaîne JSON. L’appeler plusieurs fois sur la même ligne est inefficace. Pour éviter une analyse répétée, utilisez GET_JSON_OBJECT avec une fonction table définie par l’utilisateur (UDTF) afin de transformer les données des journaux JSON. Pour plus d’informations, consultez Convertir les données des journaux JSON à l’aide des fonctions intégrées MaxCompute et des UDTF.
Exemples
Entrée JSON
Obtenir une valeur par clé
-- Returns 1.
SELECT GET_JSON_OBJECT(JSON '{"a":1, "b":2}', '$.a');
-- Returns NULL (key does not exist).
SELECT GET_JSON_OBJECT(JSON '{"a":1, "b":2}', '$.c');
Un json_path non valide renvoie NULL
-- Returns NULL.
SELECT GET_JSON_OBJECT(JSON '{"a":1, "b":2}', '$invalid_json_path');
Entrée STRING
Extraire d’un objet JSON imbriqué
-- Prepare sample data.
CREATE TABLE IF NOT EXISTS src_json (json STRING);
INSERT OVERWRITE TABLE src_json VALUES
('{"store":
{"fruit":[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],
"bicycle":{"price":19.95,"color":"red"}},
"email":"amy@only_for_json_udf_test.net",
"owner":"amy"}');
-- Returns amy.
SELECT GET_JSON_OBJECT(src_json.json, '$.owner') FROM src_json;
-- Returns {"weight":8,"type":"apple"} (preserves original string).
SET odps.sql.udf.getjsonobj.new=true;
SELECT GET_JSON_OBJECT(src_json.json, '$.store.fruit[0]') FROM src_json;
-- Returns NULL (field does not exist).
SELECT GET_JSON_OBJECT(src_json.json, '$.non_exist_key') FROM src_json;
Extraire d’un tableau JSON
-- Returns 2222.
SELECT GET_JSON_OBJECT('{"array":[["aaaa",1111],["bbbb",2222],["cccc",3333]]}', '$.array[1][1]');
-- Returns ["h0","h1","h2"] (wildcard, preserves original string).
SET odps.sql.udf.getjsonobj.new=true;
SELECT GET_JSON_OBJECT('{"aaa":"bbb","ccc":{"ddd":"eee","fff":"ggg","hhh":["h0","h1","h2"]},"iii":"jjj"}', '$.ccc.hhh[*]');
-- Returns h1.
SELECT GET_JSON_OBJECT('{"aaa":"bbb","ccc":{"ddd":"eee","fff":"ggg","hhh":["h0","h1","h2"]},"iii":"jjj"}', '$.ccc.hhh[1]');
Clés contenant un point (.)
Utilisez [''] pour accéder aux clés JSON qui contiennent un point. Cela nécessite SET odps.sql.udf.getjsonobj.new=true;.
-- Prepare sample data.
CREATE TABLE json_test (id STRING, json STRING);
-- Key contains a period.
INSERT INTO TABLE json_test (id, json) VALUES
("1", "{\"China.beijing\":{\"school\":{\"id\":0,\"book\":[{\"title\":\"A\",\"price\":8.95},{\"title\":\"B\",\"price\":10.2}]}}}");
-- Key does not contain a period.
INSERT INTO TABLE json_test (id, json) VALUES
("2", "{\"China_beijing\":{\"school\":{\"id\":0,\"book\":[{\"title\":\"A\",\"price\":8.95},{\"title\":\"B\",\"price\":10.2}]}}}");
-- Use [''] to extract from a key with a period. Returns 0.
SELECT GET_JSON_OBJECT(json, "$['China.beijing'].school['id']") FROM json_test WHERE id = 1;
-- Both . and [''] work for keys without special characters. Both return 0.
SELECT GET_JSON_OBJECT(json, "$['China_beijing'].school['id']") FROM json_test WHERE id = 2;
SELECT GET_JSON_OBJECT(json, "$.China_beijing.school['id']") FROM json_test WHERE id = 2;
[''] avec l’indicateur de nouveau comportement
SET odps.sql.udf.getjsonobj.new=true;
-- Returns 1.
SELECT GET_JSON_OBJECT('{"a.1":"1","a":"2"}', '$[\'a.1\']');
Entrée JSON vide ou non valide
-- Returns NULL (empty input).
SELECT GET_JSON_OBJECT('', '$.array[1][1]');
-- Returns NULL (missing outer braces).
SELECT GET_JSON_OBJECT('"array":["aaaa",1111],"bbbb":["cccc",3333]', '$.array[1][1]');
Caractères échappés dans les valeurs de chaîne
SET odps.sql.udf.getjsonobj.new=true;
-- Returns "1".
SELECT GET_JSON_OBJECT('{"a":"\\"1\\"","b":"2"}', '$.a');
-- Returns '1'.
SELECT GET_JSON_OBJECT('{"a":"\'1\'","b":"2"}', '$.a');
Caractères emoji
-- Returns the emoji symbol.
SELECT GET_JSON_OBJECT('{"a":"<Emoji symbol>"}', '$.a');
DataWorks ne prend pas en charge la saisie directe de caractères emoji. Utilisez un outil tel que Data Integration pour écrire des chaînes emoji encodées dans MaxCompute, puis traitez-les avec GET_JSON_OBJECT .
Étapes suivantes
Fonctions JSON — fonctions intégrées connexes pour le traitement JSON
Migrer des données JSON depuis OSS vers MaxCompute — bonnes pratiques pour la migration des données JSON
LanguageManual UDF — référence du chemin JSON d’Apache Hive