将 Uint8Array 解码为 JSON
Decode a Uint8Array into a JSON
我正在从 API 中获取数据以显示销售和财务报告,但我收到了一个 gzip 类型的文件,我设法将其转换为 Uint8Array。我想以某种方式将其解析解码为 JSON 文件,我可以用它来访问数据并在我的前端创建图表。
我尝试使用不同的库(pako 和 cborg 似乎是用例最接近的库),但我最终得到一个错误 Error: CBOR decode error: unexpected character at position 0
这是我目前的代码:
let req = https.request(options, function (res) {
console.log("Header: " + JSON.stringify(res.headers));
res.setEncoding("utf8");
res.on("data", function (body) {
const deflatedBody = pako.deflate(body);
console.log("DEFLATED DATA -----> ", typeof deflatedBody, deflatedBody);
console.log(decode(deflatedBody));
});
res.on("error", function (error) {
console.log("connection could not be made " + error.message);
});
});
req.end();
};
我希望任何人都已经偶然发现了这个并且有一些想法。
非常感谢!
请访问此答案 从响应中检索 GZIP 数据。
假设,您已经检索到 UInt8Array 的完整数据。
您只需要将 UInt8Array 作为字符串
const jsonString = Buffer.from(dataAsU8Array).toString('utf8')
const parsedData = JSON.parse(jsonString)
console.log(parsedData)
编辑
这是对我有用的方法
const {request} = require("https")
const zlib = require("zlib")
const parseGzip = (gzipBuffer) => new Promise((resolve, reject) =>{
zlib.gunzip(gzipBuffer, (err, buffer) => {
if (err) {
reject(err)
return
}
resolve(buffer)
})
})
const fetchJson = (url) => new Promise((resolve, reject) => {
const r = request(url)
r.on("response", (response) => {
if (response.statusCode !== 200) {
reject(new Error(`${response.statusCode} ${response.statusMessage}`))
return
}
const responseBufferChunks = []
response.on("data", (data) => {
console.log(data.length);
responseBufferChunks.push(data)
})
response.on("end", async () => {
const responseBuffer = Buffer.concat(responseBufferChunks)
const unzippedBuffer = await parseGzip(responseBuffer)
resolve(JSON.parse(unzippedBuffer.toString()))
})
})
r.end()
})
fetchJson("https://wiki.mozilla.org/images/f/ff/Example.json.gz")
.then((result) => {
console.log(result)
})
.catch((e) => {
console.log(e)
})
谢谢,我实际上只是尝试了这种方法,但出现以下错误:
语法错误:JSON 解析错误:意外的标识符“x”
但我设法使用以下函数以文本格式打印数据:
getFinancialReports = (options, callback) => {
// buffer to store the streamed decompression
var buffer = [];
https
.get(options, function (res) {
// pipe the response into the gunzip to decompress
var gunzip = zlib.createGunzip();
res.pipe(gunzip);
gunzip
.on("data", function (data) {
// decompression chunk ready, add it to the buffer
buffer.push(data.toString());
})
.on("end", function () {
// response and decompression complete, join the buffer and return
callback(null, buffer.join(""));
})
.on("error", function (e) {
callback(e);
});
})
.on("error", function (e) {
callback(e);
});
};
现在我需要将其传递给 JSON 对象。
我正在从 API 中获取数据以显示销售和财务报告,但我收到了一个 gzip 类型的文件,我设法将其转换为 Uint8Array。我想以某种方式将其解析解码为 JSON 文件,我可以用它来访问数据并在我的前端创建图表。
我尝试使用不同的库(pako 和 cborg 似乎是用例最接近的库),但我最终得到一个错误 Error: CBOR decode error: unexpected character at position 0
这是我目前的代码:
let req = https.request(options, function (res) {
console.log("Header: " + JSON.stringify(res.headers));
res.setEncoding("utf8");
res.on("data", function (body) {
const deflatedBody = pako.deflate(body);
console.log("DEFLATED DATA -----> ", typeof deflatedBody, deflatedBody);
console.log(decode(deflatedBody));
});
res.on("error", function (error) {
console.log("connection could not be made " + error.message);
});
});
req.end();
};
我希望任何人都已经偶然发现了这个并且有一些想法。 非常感谢!
请访问此答案 从响应中检索 GZIP 数据。
假设,您已经检索到 UInt8Array 的完整数据。
您只需要将 UInt8Array 作为字符串
const jsonString = Buffer.from(dataAsU8Array).toString('utf8')
const parsedData = JSON.parse(jsonString)
console.log(parsedData)
编辑
这是对我有用的方法
const {request} = require("https")
const zlib = require("zlib")
const parseGzip = (gzipBuffer) => new Promise((resolve, reject) =>{
zlib.gunzip(gzipBuffer, (err, buffer) => {
if (err) {
reject(err)
return
}
resolve(buffer)
})
})
const fetchJson = (url) => new Promise((resolve, reject) => {
const r = request(url)
r.on("response", (response) => {
if (response.statusCode !== 200) {
reject(new Error(`${response.statusCode} ${response.statusMessage}`))
return
}
const responseBufferChunks = []
response.on("data", (data) => {
console.log(data.length);
responseBufferChunks.push(data)
})
response.on("end", async () => {
const responseBuffer = Buffer.concat(responseBufferChunks)
const unzippedBuffer = await parseGzip(responseBuffer)
resolve(JSON.parse(unzippedBuffer.toString()))
})
})
r.end()
})
fetchJson("https://wiki.mozilla.org/images/f/ff/Example.json.gz")
.then((result) => {
console.log(result)
})
.catch((e) => {
console.log(e)
})
谢谢,我实际上只是尝试了这种方法,但出现以下错误:
语法错误:JSON 解析错误:意外的标识符“x”
但我设法使用以下函数以文本格式打印数据:
getFinancialReports = (options, callback) => {
// buffer to store the streamed decompression
var buffer = [];
https
.get(options, function (res) {
// pipe the response into the gunzip to decompress
var gunzip = zlib.createGunzip();
res.pipe(gunzip);
gunzip
.on("data", function (data) {
// decompression chunk ready, add it to the buffer
buffer.push(data.toString());
})
.on("end", function () {
// response and decompression complete, join the buffer and return
callback(null, buffer.join(""));
})
.on("error", function (e) {
callback(e);
});
})
.on("error", function (e) {
callback(e);
});
};
现在我需要将其传递给 JSON 对象。