大家好,
我有一个插件,它使用一些 JSL 从 API 端点检索数据并将其转换为 JMP 中的数据表。 一切正常,只是生成的数据表按字母顺序对 JSON 键进行排序。
我知道 JSON 键是无序的,但是当它们转换为数据表列时,有什么方法可以保留它们原来的顺序吗?
谢谢,
安迪
request = New HTTP Request(
URL( "https://xyz.com/api" ),
Method( "Get" ),
Query String(
[["token" => "abcdefg"]]
)
);
json = request << Send();
jsl_json = Parse JSON( json );
dt = JSON To Data Table( As JSON Expr( jsl_json["items"], Guess("wide") ) );当您将 json 字符串解析为关联数组时,会发生重新排序。 然后,您提取键“items”下的一部分,将其转换回另一个 json 字符串,并将其转换为数据表。
我建议跳过大部分内容并通过 open() 而不是 JsonToDataTable() 使用 json 导入向导。 要获取您需要的脚本:
- savetextfile("$temp/x.json",json) 并使用 json 向导打开它(在文件 -> 打开对话框中选择 json 过滤器)。 您可能会很幸运并能够选择猜测值之一。 如果没有,请选择巨大,打开堆栈复选框,取消选中不需要的列,取消选中 ROWS 下除“items”之外的所有内容。 这可能非常接近您所需要的。
- 打开并从结果表中复制源脚本。 您可以根据需要重新排列源脚本中的 COLS。 下次使用该脚本。 COLS 的初始订购可能就是您所要求的。
下面是一个使用 blob 避免临时文件的示例。
request = New HTTP Request( URL( "http://api.open-notify.org/iss-now.json" ), Method( "Get" ), Query String( [["token" => "abcdefg"]] ) );
jsontext = request << send; // not scrambled yet
jsonblob = Char To Blob( jsontext );
Open(jsonblob,
JSON Settings(
Stack( 0 ),
Row( "/root" ),
Col( "/root/timestamp", Column Name( "timestamp" ), Fill( "Use Once" ), Type( "Numeric" ), Format( {"Best"} ), Modeling Type( "Continuous" ) ),
Col( "/root/iss_position/longitude", Column Name( "longitude" ), Fill( "Use Once" ), Type( "Numeric" ), Format( {"Best"} ), Modeling Type( "Continuous" ) ),
Col( "/root/iss_position/latitude", Column Name( "latitude" ), Fill( "Use Once" ), Type( "Numeric" ), Format( {"Best"} ), Modeling Type( "Continuous" ) ),
Col( "/root/message", Column Name( "message" ), Fill( "Use Once" ), Type( "Character" ), Format( {"Best"} ), Modeling Type( "Continuous" ) )
),
jsonwizard( 0 )
);