JSON en table de données: comment éviter que les colonnes NULL ne soient automatiquement supprimées?Salut tout le monde,
J'utilise JMP 15 et j'ai JSL qui récupère une charge utile JSON via Http Request (), l'exécute via Char to Blob (), puis l'ouvre () dans une table de données. Le contenu de la charge utile JSON est dynamique, mais est toujours mappable à un format tabulaire (lignes et colonnes).
Le problème: si des clés du JSON ont toutes les valeurs NULL, elles ne sont pas incluses dans la table de données (c'est-à-dire qu'aucune colonne n'est créée pour ces clés). Cela pose problème, car je souhaite que toutes les clés du JSON soient affichées sous forme de colonnes dans la table de données, que toutes les valeurs soient NULL ou non.
Si j'enregistre la charge utile dans un fichier local et que je l'ouvre directement en utilisant Open (), j'obtiens le résultat souhaité: une table de données où toutes les clés sont converties en colonnes, et toutes les valeurs NULL sont affichées comme NULL. Cependant, cela ne fonctionnera pas pour mon cas d'utilisation.
Voici le JSL de base qui réplique le problème. Au lieu de Http Request (), je récupère les données avec Load Text File (), qui donne les mêmes résultats. Le fichier "data.json" est joint.
dt1 = Open("/Users/abc/data.json", JSON ); // works as desired
raw = Load Text File("/Users/abc/data.json");
jsonblob = Char To Blob( raw );
dt2 = open(jsonblob, "JSON", Guess("wide")); // does not work as desired -- drops all-NULL columnsQuelqu'un peut-il suggérer une méthode pour convertir JSON dans une variable en une table de données qui préserve les clés all-NULL?
Merci!
Andy
ScriptingRe: JSON à la table de données: comment éviter que les colonnes NULL soient automatiquement supprimées?J'ai écrit une réponse ci-dessous qui pourrait aider, puis j'ai réalisé qu'il y avait une réponse simple que vous devriez essayer en premier. Les données semblent être l'un des formats pandas, alors changez «large» en «pandas».
Si cela s'avère faux, essayez ...
Utilisez l'assistant pour sélectionner explicitement les colonnes, puis utilisez ce script.
Vous voudrez probablement aussi l'option stack.
J'ai également changé le générateur de lignes de la racine aux éléments, car il est un peu plus correct. Cela ne fera probablement pas une réelle différence.
L'élément sélectionné pour Ligne entraîne l'écriture d'une nouvelle ligne dans la table de données à chaque fois que cet élément se produit. Activez les statistiques et vous pouvez voir les éléments qui se répètent 2 fois.
Re: JSON à la table de données: comment éviter que les colonnes NULL soient automatiquement supprimées?Merci pour les suggestions, Craige. Je les ai essayés et j'ai quelques questions complémentaires:
1. changer Guess de "large" à "pandas" inclut avec succès les colonnes NULL dans la table de données - malheureusement, cela introduit un nouveau problème: la dernière "ligne" de données JSON est répétée pour chaque ligne de la table de données ( voir "pandas.png", ci-joint - Le numéro de lot 21055 est répété deux fois, et le numéro de lot 21054 n'est pas inclus. J'ai répliqué ce même comportement avec un plus grand ensemble de données).
Y a-t-il un autre paramètre ou configuration Open () qui pourrait corriger cela?
2. J'ai réussi à importer le fichier data.json, y compris les colonnes NULL, à l'aide de l'assistant - cependant, le script qu'il a produit est spécifique à la charge utile dans data.json (voir "script_view.png", ci-joint). Mon cas d'utilisation est plus général - les charges utiles que mon JSL reçoit varieront en nombre de colonnes et d'étiquettes de colonnes. Existe-t-il un moyen d'utiliser la sortie de l'assistant pour créer une option de configuration plus générique? Ou ma seule option est-elle d'itérer manuellement sur la charge utile et de construire la table de données colonne par colonne?
2b. À ce propos - pouvez-vous me diriger vers une documentation sur l'utilisation du paramètre "Paramètres JSON" avec Open ()? Je n'ai rien trouvé dans la référence de syntaxe ou dans l'index de script (et quand je cherche sur 'JMP JSL "JSON settings"', le premier hit est ma question précédente sur ce forum).
3. Existe-t-il un moyen de forcer Open () à importer des colonnes vides sous forme numérique? J'ai essayé "Traiter les colonnes vides comme numériques (1)" dans les paramètres d'importation et cela a causé le traitement du fichier data.json comme une seule ligne / enregistrement (voir "pandas_numeric.png, ci-joint), donc je suppose que je le fais quelque chose d'incorrect.
Merci!
Andy
Re: JSON à la table de données: comment éviter que les colonnes NULL soient automatiquement supprimées?- OK, je pense que l'option large est la bonne option à utiliser et c'est un bogue que toutes les colonnes manquantes soient supprimées de l'importation.@Wendy_Murphrey Cela complique certainement les choses.
- Si vous connaissez toutes les colonnes possibles et que seul un sous-ensemble sera dans le JSON, vous pouvez toutes les répertorier dans les paramètres JSON. Faites d'abord un petit test, voyez si cela fonctionne comme vous le souhaitez (je ne sais pas si vous obtiendrez l'ensemble complet de colonnes ou simplement le sous-ensemble qui apparaît dans le JSON.)
- Il y a toujours accès à une version précédente du code d'importation JSON; la spécification de JSON (sans les PARAMÈTRES JSON) peut faire ce que vous voulez.
blob=loadtextfile("$DESKTOP/data.json",blob);
Open(blob,JSON)- Le JSON ne ressemble exactement à aucun des formats pandas. Mais l'option pandas semble récupérer les noms de colonnes souhaités; si rien d'autre ne fonctionne, cela pourrait être un point de départ pour créer les paramètres JSON à la volée pour une deuxième importation pour vraiment obtenir les données.
- Il n'y a pas de doc spécifique sur les paramètres JSON que je connaisse; il est destiné à être écrit par l'assistant et toujours lisible par l'homme. Il correspond aux valeurs de la boîte de dialogue de l'assistant, et il y a du document là-bas.
- Je suis presque sûr que les ImportOptions sont utilisées par l'importation CSV, et peut-être autre chose. Ils ne sont pas utilisés par l'assistant JSON.
Re: JSON à la table de données: comment éviter que les colonnes NULL soient automatiquement supprimées?Et si vous avez un contrôle sur la source du json et pouvez l'obtenir comme un vrai format pandas,
orient='table' (in python code)
pourrait être un bon choix. L'importation de JMP peut utiliser certaines de ces métadonnées. JMP peut également lire les autres orientations.
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_json.html
Re: JSON à la table de données: comment éviter que les colonnes NULL soient automatiquement supprimées?Merci pour la note, @Craige_Hales .J'ai signalé le défaut noté dans la puce 1 à l'équipe de développement pour examen dans une future version de JMP.
Pour ce que ça vaut, il semble que ceux-ci ne suppriment pas les colonnes nulles dans JMP 14.3.
raw = Load Text File( "$DOWNLOADS/data.json" );
jsonblob = Char To Blob( raw );
dt2 = Open( jsonblob, "JSON", Guess( "wide" ) );
JSON To Data Table( raw, Guess( "wide" ) );
Re: JSON à la table de données: comment éviter que les colonnes NULL soient automatiquement supprimées?Les tableaux JSON qui n'ont aucun élément sont problématiques pour JMP.Une option consiste à remplacer les tableaux vides par des tableaux qui ont au moins un enfant.Vous pouvez rendre cet enfant nul ou utiliser le caractère de valeur manquante - [.].Je pense que cela signifie que vous n'aurez plus de JSON valide, mais JMP 16 le lira toujours et pour le moment, il n'est pas prévu de briser ce comportement.L'utilisation de null créera une colonne de caractères et l'utilisation de la valeur manquante créera une colonne numérique.Si vous savez qu'il n'y a pas de chaîne de données dans votre JSON qui contient [], vous pouvez simplement effectuer cette modification
raw = Load Text File("$downloads/data.json");
jsonblob = Char To Blob( substitute(raw,"[]",".") );
dt2 = open(jsonblob, "JSON", Guess("wide"));
Si vous voulez vous protéger contre le remplacement de [] dans les chaînes JSON, il faudra encore quelques lignes de jsl pour sauter les chaînes, mais cela ne devrait toujours pas être trop difficile.