JSON到数据表:如何避免NULL列被自动删除?大家好,
我使用的是JMP 15,并且具有JSL,该JSL通过Http Request()检索JSON有效负载,通过Char将其运行到Blob(),然后在数据表中open()s它。 JSON有效内容是动态的,但始终可映射为表格格式(行和列)。
问题是:如果JSON中的任何键都具有所有NULL值,则它们不包含在数据表中(即,没有为这些键创建任何列)。 这是有问题的,因为无论所有值是否为NULL,我都希望将JSON中的所有键都显示为数据表中的列。
如果将有效负载保存在本地文件中,然后使用Open()直接将其打开,则会得到所需的结果:一个数据表,其中所有键都转换为列,并且所有NULL值都显示为NULL。 但是,这不适用于我的用例。
这是复制问题的基本JSL。 代替Http Request(),我使用Load Text File()检索数据,该结果相同。 附件为“ 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转换为保留全空键的数据表的方法吗?
谢谢!
安迪
脚本编写回复:JSON到数据表:如何避免NULL列被自动删除?我在下面写了一个可能有帮助的答案,然后我意识到有一个简单的答案应该首先尝试。 数据似乎是大熊猫格式之一,因此请将“ wide”更改为“ pandas”。
如果发现错误,请尝试...
使用向导明确选择列,然后使用该脚本。
您可能还需要stack选项。
我也将行生成器从根目录更改为项,因为它更正确。 可能不会带来真正的改变。
为“行”选择的项目导致每次出现新行时都会将其写入数据表。 打开统计信息,您会看到重复2次的项目。
回复:JSON到数据表:如何避免NULL列被自动删除?感谢您的建议,Craige。 我尝试了它们,并提出了一些后续问题:
1.将Guess从“ wide”更改为“ pandas”确实可以在数据表中成功包含NULL列-不幸的是,这引入了一个新问题:JSON数据的最后“行”对于数据表的每一行都重复一次(请参阅“ pandas.png”(附件)-重复编号21055两次,并且不包括编号21054。 我用更大的数据集复制了相同的行为。
是否还有其他Open()参数或配置可以纠正此问题?
2.我能够使用向导成功导入data.json文件,包括NULL列-但是,它生成的脚本特定于data.json中的有效负载(请参见“ script_view.png”,已随附)。 我的用例比较笼统-我的JSL接收到的有效负载的列数和列标签会有所不同。 有没有一种方法可以使用向导的输出来创建更通用的config选项? 还是我唯一的选择手动遍历有效负载并逐列构造数据表?
2b。 与此相关-您能否指出我有关在Open()中使用“ JSON设置”参数的任何文档? 我在“语法参考”或“脚本编制索引”中找不到任何内容(当我用Google搜索“ JMP JSL“ JSON设置””时,最热门的是我在该论坛上遇到的问题)。
3.有没有一种方法可以强制Open()将空列导入为Numeric? 我在“导入设置”中尝试了“将空列作为数字处理(1)”,这导致data.json文件被视为单行/记录(请参见“ pandas_numeric.png,已附加”),所以我假设我在做不正确的东西。
谢谢!
安迪
回复:JSON到数据表:如何避免NULL列被自动删除?- 好的,我认为wide选项是使用的正确选项,并且从导入中删除了所有缺失的列是一个错误。@温迪·墨菲这无疑使事情变得复杂。
- 如果您知道所有可能的列,并且JSON中只有一个子集,则可以在JSON设置中列出所有它们。 首先做一个小测试,看看它是否可以按照您需要的方式工作(我不确定您是否将获得完整的列集或仅显示在JSON中的子集。)
- 仍然可以访问JSON导入代码的先前版本;指定JSON(不使用JSON SETTINGS)可以完成您想要的操作。
blob=loadtextfile("$DESKTOP/data.json",blob);
Open(blob,JSON)- JSON看起来与任何熊猫格式都不完全相同。 但是pandas选项似乎确实可以检索到您想要的列名。如果没有其他方法可行,则可能是动态创建JSON设置以进行第二次导入以真正获取数据的起点。
- 据我所知,关于JSON设置,没有任何具体文档;它旨在由向导编写,并且仍然易于阅读。 它与向导对话框的值匹配,并且那里有一些文档。
- 我敢肯定CSV导入会使用ImportOptions,也许还有其他用途。 JSON向导不使用它们。
回复:JSON到数据表:如何避免NULL列被自动删除?而且,如果您可以控制json的来源,并且可以将其获取为真正的熊猫格式,
orient='table' (in python code)
可能是一个不错的选择。 JMP的导入可以使用其中一些元数据。 JMP也可以读取其他方向。
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_json.html
回复:JSON到数据表:如何避免NULL列被自动删除?感谢您的来信, @Craige_Hales 。我已将项目1中指出的缺陷报告给开发团队,以供将来的JMP版本考虑。
值得一提的是,这些似乎并没有删除JMP 14.3中的null列。
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数组对于JMP来说是有问题的。一种选择是将空数组替换为具有至少一个子级的数组。您可以将该子级设置为null或使用缺失值字符-[。]。我认为这意味着您将不再拥有有效的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来跳过字符串,但仍然应该不太困难。