大家好,
我有一個插件,它使用一些 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 )
);