我有一個資料記錄器,它通過附加到檔案來記錄時間、狀態和溫度。(記錄器是從 cron 作業呼叫的。)
如果我可以將資料作為 JSON 讀入網頁腳本中,那就太好了,但我看不出有什么好的方法——要么我的記錄器更復雜,要么我的閱讀器更復雜。
我的資料是這樣的:
[ timestamp, "status", temperature ]
[ 123456789, "sync", 12345]
我可以很容易地在行尾添加逗號,但無論哪種方式,它都不是格式良好的 JSON——整個內容都需要括號。
所以要么我的記錄器必須檢測一個空的資料檔案并添加一個前導括號,加上尋找到最后,備份一個字符,用逗號替換最后一個右括號,然后用一個額外的右括號附加它自己的記錄,或者讀者必須通過切掉尾隨逗號并在周圍添加括號來按摩 pre-JSON。
有沒有更簡單的方法來做到這一點?
uj5u.com熱心網友回復:
你可以這樣做
我會用 fetch
const str = `[ timestamp, "status", temperature ]
[ 123456789, "sync", 12345]`
const data = str.split(/\r?\n/) // line feed
.map(line => line
.replace(/[\[\]]/g,"") // remove square brackets (can be done in the regex below too
.match(/(".*?"|[^",\s] )(?=\s*,|\s*$)/g) // find stuff with or without quotes
.map(elem => isNaN(elem) ? elem : elem) // convert numbers back to numbers
);
console.log(data)
uj5u.com熱心網友回復:
您使用的格式類似于一種既已建立又非常適合記錄的格式:請參閱JSON Lines和ndjson。
通過在第一行之后分割您的輸入,您將留下 JSON 行。然后你只需要迭代這些行并決議每一行(如果需要,可以選擇收集到一個陣列中)。
下面是一個例子:
const LF = '\n';
function iterateJSONLines (jsonl, cb) {
for (const line of jsonl.trim().split(LF)) {
cb(JSON.parse(line));
}
}
/** handle the first (non-JSON) line in your input */
function separateHeaderFromJSONLines (input) {
for (let i = 0; i < input.length; i = 1) {
if (input[i] !== LF) continue;
return [input.slice(0, i).trim(), input.slice(i 1)];
}
}
function main (input) {
const [headerLine, jsonl] = separateHeaderFromJSONLines(input);
const arr = [];
iterateJSONLines(jsonl, arr.push.bind(arr));
console.log(headerLine);
console.log(arr);
}
const input = `[ timestamp, "status", temperature ]
[ 123456789, "sync", 12345]
[ 987654321, "anotherStatus", 54321]
`;
main(input);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/379256.html
標籤:javascript json 格式化
