JSON到数据表:如何避免NULL列被自动删除?大家好,
我正在使用 JMP 15 并让 JSL 通过 Http Request() 检索 JSON 有效负载,通过 Char to Blob() 运行它,然后在数据表中 open() 它。 JSON 负载内容是动态的,但始终可映射为表格格式(行和列)。
问题:如果 JSON 中的任何键都具有 NULL 值,则它们不会包含在数据表中(即,不会为这些键创建任何列)。 这是有问题的,因为我希望 JSON 中的所有键都显示为数据表中的列,无论所有值是否为 NULL。
如果我将有效负载保存在本地文件中并直接使用 Open() 打开它,我会得到所需的结果:一个数据表,其中所有键都转换为列,并且所有 NULL 值都显示为 NULL。 但是,这不适用于我的用例。
这是复制该问题的基本 JSL。 我使用 Load Text File() 检索数据,而不是 Http Request(),这给出了相同的结果。 附加文件“data.json”。
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 columns谁能建议一种将变量中的 JSON 转换为保留全 NULL 键的数据表的方法?
谢谢!
安迪
分享和交流结果回复:JSON 到数据表:如何避免 NULL 列被自动删除?没有元素的 JSON 数组对于 JMP 来说是有问题的。一种选择是用至少有一个子级的数组替换空数组。您可以将该子项设为空或使用缺失值字符 - [.]。我认为这意味着您将不再拥有有效的 JSON,但 JMP 16 仍会读取它,并且目前没有计划破坏该行为。使用 null 将创建字符列,使用缺失值将创建数字列。如果您知道 JSON 中没有包含 [] 的字符串数据,那么您可以简单地进行此更改
raw = Load Text File("$downloads/data.json");
jsonblob = Char To Blob( substitute(raw,"[]",".") );
dt2 = open(jsonblob, "JSON", Guess("wide"));
如果您确实想防止在 JSON 字符串中替换 [],则需要多几行 jsl 来跳过字符串,但应该不会太难。
回复:JSON 到数据表:如何避免 NULL 列被自动删除?感谢您的备注, @Craige_Hales 。我已向开发团队报告了第 1 条中指出的缺陷,以便在 JMP 的未来版本中考虑。
就其价值而言,这些似乎不会删除 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" ) );
回复:JSON 到数据表:如何避免 NULL 列被自动删除?如果您可以控制 json 的源并且可以将其作为真正的 pandas 格式获取,
orient='table' (in python code)
可能是一个不错的选择。 JMP 的导入可以使用其中一些元数据。 JMP 也可以读取其他方向。
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_json.html
回复:JSON 到数据表:如何避免 NULL 列被自动删除?- 好的,我认为宽选项是正确的选择,并且从导入中删除所有缺失的列是一个错误。@Wendy_Murphrey这肯定会让事情变得复杂。
- 如果您知道所有可能的列,并且 JSON 中只有一个子集,则可以在 JSON 设置中列出所有这些列。 首先做一个小测试,看看它是否按照您需要的方式工作(我不确定您是否会获得完整的列集或仅获得 JSON 中出现的子集。)
- 仍然可以访问以前版本的 JSON 导入代码;指定 JSON(不带 JSON SETTINGS 或 Guess 参数)可能会执行您想要的操作。
blob=loadtextfile("$DESKTOP/data.json",blob);
Open(blob,JSON)- JSON 看起来与任何 pandas 格式都不完全相同。 但 pandas 选项似乎确实检索了您想要的列名;如果没有其他办法,这可能是动态创建 JSON 设置的起点,以便第二次导入真正获取数据。
- 据我所知,没有关于 JSON 设置的具体文档;它旨在由向导编写并且仍然是人类可读的。 它与向导对话框值匹配,并且那里有一些文档。
- 我很确定 ImportSettings 是由 CSV 导入使用的,也许还有其他东西。 JSON 向导不使用它们。
(更新:一些小修改)
回复:JSON 到数据表:如何避免 NULL 列被自动删除?感谢您的建议,克雷格。 我尝试了它们并有一些后续问题:
1.将Guess从“wide”更改为“pandas”确实成功地在数据表中包含了NULL列——不幸的是,它引入了一个新问题:数据表的每一行都重复了JSON数据的最后“行”(参见附件“pandas.png”——批号 21055 重复两次,批号 21054 不包括在内。 我用更大的数据集复制了相同的行为)。
是否有任何其他 Open() 参数或配置可以纠正此问题?
2. 我能够使用向导成功导入 data.json 文件,包括 NULL 列——但是,它生成的脚本特定于 data.json 中的有效负载(请参阅附件中的“script_view.png”)。 我的用例更为一般——我的 JSL 接收的有效负载在列数和列标签方面会有所不同。 有没有办法使用向导的输出来创建更通用的配置选项? 或者是我手动迭代有效负载并逐列构建数据表的唯一选择?
2b. 与此相关——您能给我指出有关在 Open() 中使用“JSON 设置”参数的任何文档吗? 我在语法参考或脚本索引中找不到任何内容(当我搜索“JMP JSL“JSON 设置””时,最热门的是我在此论坛上的上一个问题)。
3. 有没有办法强制 Open() 将空列导入为数字? 我在导入设置中尝试了“将空列视为数字 (1)”,它导致 data.json 文件被视为单行/记录(请参阅“pandas_numeric.png,附件),所以我假设我正在做有什么不正确的。
谢谢!
安迪
回复:JSON 到数据表:如何避免 NULL 列被自动删除?我在下面写了一个可能有帮助的答案,然后我意识到有一个简单的答案你应该首先尝试。 该数据似乎是 pandas 格式之一,因此将“wide”更改为“pandas”。
如果结果是错误的,请尝试...
使用向导显式选择列,然后使用该脚本。
You'll probably want the stack option too.You'll probably want the stack option too.您可能也需要堆栈选项。
我还将行生成器从 root 更改为 items,因为它更正确一些。 可能不会产生真正的影响。
为“行”选择的项目会导致每次出现该项目时都会将新行写入数据表。 打开统计,你可以看到重复2次的项目。