JSON <=> 跳转全部,
我有一个两部分的问题。
第1部分。
假设我有一个这样的 JSON 文件:
[
{
"Cat1": {
"SubCat1": {
"Param1": "AA",
"Param2": "BB"
},
"SubCat2": {
"Param1": "AB",
"Param2": "BC"
}
},
"Cat2": {
"SubCat1": {
"Param1": "BA",
"Param2": "BC"
},
"SubCat2": {
"Param1": "CB",
"Param2": "BD"
}
}
}
]我如何将它导入 JMP(使用 GUI 或脚本)以获得如下内容:

到目前为止,我只是得到一堆列和一行。
第2部分。
现在我需要将 JMP 表转换为 JSON 文件。 假设我有一个如上所示的 JMP 文件。 简单地将其保存为 JSON 将导致:
[
{
"Category" : "Cat1",
"SubCategory" : "SubCat1",
"Parameter" : "Param1",
"Value" : "AA"
},
{
"Category" : "Cat1",
"SubCategory" : "SubCat1",
"Parameter" : "Param2",
"Value" : "BB"
},
{
"Category" : "Cat1",
"SubCategory" : "SubCat2",
"Parameter" : "Param1",
"Value" : "AB"
},
{
"Category" : "Cat1",
"SubCategory" : "SubCat2",
"Parameter" : "Param2",
"Value" : "BC"
},
{
"Category" : "Cat2",
"SubCategory" : "SubCat1",
"Parameter" : "Param1",
"Value" : "BA"
},
{
"Category" : "Cat2",
"SubCategory" : "SubCat1",
"Parameter" : "Param2",
"Value" : "BC"
},
{
"Category" : "Cat2",
"SubCategory" : "SubCat2",
"Parameter" : "Param1",
"Value" : "CB"
},
{
"Category" : "Cat2",
"SubCategory" : "SubCat2",
"Parameter" : "Param2",
"Value" : "BD"
}
]这不好。
但是如果我构建一个看起来像这样的 AA 并将其保存为 JSON:
AA = [
"Cat1"=> [
"SubCat1"=> [
"Param1"=> "AA",
"Param2"=> "BB"
],
"SubCat2"=> [
"Param1"=> "AB",
"Param2"=> "BC"
]
],
"Cat2"=> [
"SubCat1"=> [
"Param1"=> "BA",
"Param2"=> "BC"
],
"SubCat2"=> [
"Param1"=> "CB",
"Param2"=> "BD"
]
]
];
JSON = As JSON Expr(AA);
Save Text File("C:\Users\MyUser\JMPtoJSON\AAtoJSON.json", JSON)然后我得到我需要的 JSON。
问题 - 从这样的 JMP 表构造 AA 的最有效方法是什么?
谢谢!
数据表其他脚本回复:JSON <=> JMP谢谢,克雷格,
我使用的好提示
!Contains()
我开始为每一列创建 AA,并获取键以获取特定级别的唯一值以迭代它们并使其变得过于复杂。 你的方法简单多了。
回复:JSON <=> JMP作为@Thierry_S指出,JSON格式正在使用数据而不是名字钥匙。 您的 JMP 首选 save-to-json 示例使用列名字对于钥匙。
Pandas JSON 格式可以挤出一些冗余,JMP 可以读取它们(但不能直接写入它们。 @Audrey_Shull )
回复:JSON <=> JMP第 2 部分,使用第 1 部分中的 dt2。 对于每一行,创建键+AA(如果尚未创建),然后添加下一级键。 这将保留最后一次出现的重复行。
result = [=> ];
For( i = 1, i <= N Rows( dt2 ), i += 1,
If( !Contains( result, dt2:category[i] ),
result[dt2:category[i]] = [=> ]
);
If( !Contains( result[dt2:category[i]], dt2:SubCategory[i] ),
result[dt2:category[i]][dt2:SubCategory[i]] = [=> ]
);
result[dt2:category[i]][dt2:SubCategory[i]][dt2:Parameter[i]] = dt2:value[i];
);
Write( As JSON Expr( result ) );
{
“第一类”:
{
"SubCat1":{"Param1":"AA","Param2":"BB"},
"SubCat2":{"Param1":"AB","Param2":"BC"}
},
“第二类”:
{
"SubCat1":{"Param1":"BA","Param2":"BC"},
"SubCat2":{"Param1":"CB","Param2":"BD"}
}
}
回复:JSON <=> JMP第 1 部分答案
dt1 = Open(
Char To Blob(
"\[[
{
"Cat1": {
"SubCat1": {
"Param1": "AA",
"Param2": "BB"
},
"SubCat2": {
"Param1": "AB",
"Param2": "BC"
}
},
"Cat2": {
"SubCat1": {
"Param1": "BA",
"Param2": "BC"
},
"SubCat2": {
"Param1": "CB",
"Param2": "BD"
}
}
}
]]\"
),
json
);
dt2 = dt1 << Transpose( columns( dt1 << getcolumnnames ) ); // the 8 columns become the 8 rows
name = {"category", "SubCategory", "Parameter"}; // add these new column names
For( i = 1, i <= nitems(name), i += 1,
nc = dt2 << New Column( name[i], formula( Word( i, label, "." ) ) );
dt2 << runformulas; // run,
nc << deleteformula(); // and remove so label is no longer referenced
);
// pretty it up...
dt2:row1 << setname( "value" );
dt2 << deletecolumns( label ); // unreferenced now, and not needed
// move value to end if desired...
dt2:value << setselected; dt2 << move selected columns( to last ); dt2 << Clear Column Selection(); 导入表的数据在一行中,但已编码到列名中。 转置后,在列公式中使用 word() 函数将带点的名称拆分为 3 列。 删除公式,以便可以删除标签列,因为它现在是多余的。
transposed and column-ized转置和列化
回复:JSON <=> JMP我猜它应该使用像“Column1”这样的通用名称,或者如果通过 GUI 完成,只需选择输入它。
我认为它应该有一个选项可以说 - 从级别 1 到此列的所有内容,从级别 2 到该列的所有内容,依此类推......
回复:JSON <=> JMP你好,
乍一看,您的原始 JSON 文件不包含任何我混淆 JMP JSON 导入例程的列标题。 只是一个想法。
最好的,
TS