JSON vers 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 il est toujours mappable à un format tabulaire (lignes et colonnes).
Le problème : si des clés du JSON ont toutes des 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). Ceci est problématique, 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 à l'aide de Open(), j'obtiens le résultat souhaité : une table de données dans laquelle toutes les clés sont converties en colonnes et toutes les valeurs NULL sont affichées en tant que NULL. Cependant, cela ne fonctionnera pas pour mon cas d'utilisation.
Voici JSL de base qui reproduit 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 entièrement NULL ?
Merci!
Andy
Partage et communication des résultatsRe : JSON vers table de données : comment éviter que les colonnes NULL ne soient automatiquement supprimées ?Les tableaux JSON qui ne contiennent 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 casser 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 données de chaîne dans votre JSON contenant [], vous pouvez simplement apporter cette modification
raw = Load Text File("$downloads/data.json");
jsonblob = Char To Blob( substitute(raw,"[]",".") );
dt2 = open(jsonblob, "JSON", Guess("wide"));
Si vous souhaitez vous protéger contre le remplacement de [] dans les chaînes JSON, il faudra quelques lignes supplémentaires de jsl pour ignorer les chaînes, mais cela ne devrait toujours pas être trop difficile.
Re : JSON vers table de données : comment éviter que les colonnes NULL ne soient automatiquement supprimées ?Merci pour la remarque, @Craige_Hales .J'ai signalé la lacune notée au point 1 à l'équipe de développement afin qu'elle soit prise en compte 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 vers table de données : comment éviter que les colonnes NULL ne soient automatiquement supprimées ?Et si vous avez un contrôle sur la source du json et que vous pouvez l'obtenir sous un vrai format pandas,
orient='table' (in python code)
peut ê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 vers table de données : comment éviter que les colonnes NULL ne 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 rend certainement les choses compliquées.
- 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 seulement le sous-ensemble qui apparaît dans le JSON.)
- Il est toujours possible d'accéder à une version précédente du code d'importation JSON ; spécifier JSON (sans les paramètres JSON SETTINGS ou Guess) peut faire ce que vous voulez.
blob=loadtextfile("$DESKTOP/data.json",blob);
Open(blob,JSON)- Le JSON ne ressemble pas exactement à l'un des formats pandas. Mais l'option pandas semble récupérer les noms de colonnes que vous souhaitez ; 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. Cela correspond aux valeurs de la boîte de dialogue de l'assistant, et il y a une documentation là-bas.
- Je suis presque sûr que les ImportSettings sont utilisés par l'importation CSV, et peut-être autre chose. Ils ne sont pas utilisés par l'assistant JSON.
(mise à jour : quelques petites modifications)
Re : JSON vers table de données : comment éviter que les colonnes NULL ne soient automatiquement supprimées ?Merci pour les suggestions, Craige. Je les ai essayés et j'ai quelques questions de suivi:
1. changer Guess de "wide" à "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 reproduit ce même comportement avec un ensemble de données plus grand).
Existe-t-il un autre paramètre ou configuration Open() qui pourrait corriger cela ?
2. J'ai pu importer avec succès 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", joint). Mon cas d'utilisation est plus général - les charges utiles que ma JSL reçoit varient en nombre de colonnes et d'étiquettes de colonne. Existe-t-il un moyen d'utiliser la sortie de l'assistant pour créer une option de configuration plus générique ? Ou est-ce que ma seule option est d'itérer manuellement sur la charge utile et de construire la table de données colonne par colonne ?
2b. En relation avec cela - pouvez-vous m'indiquer 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 l'index de script (et quand je google 'JMP JSL "Paramètres JSON"', le premier résultat est ma question précédente sur ce forum).
3. Existe-t-il un moyen de forcer Open() à importer des colonnes vides en tant que numériques ? J'ai essayé "Traiter les colonnes vides comme numériques (1)" dans les paramètres d'importation et le fichier data.json a été traité comme une seule ligne/enregistrement (voir "pandas_numeric.png, joint), donc je suppose que je fais quelque chose d'incorrect.
Merci!
Andy
Re : JSON vers table de données : comment éviter que les colonnes NULL ne 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 d'abord essayer. 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.
You'll probably want the stack option too.You'll probably want the stack option too.Vous voudrez probablement aussi l'option de pile.
J'ai également changé le générateur de lignes de racine à é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 se répéter 2 fois.