node中toString() JSON.parse() JSON.stringify()的区别

本文详细介绍了在Node.js环境中如何使用JSON.parse()和JSON.stringify()方法进行JSON对象与字符串之间的相互转换,同时展示了如何利用toString()方法将Buffer转换为字符串,适用于处理文件读取等场景。

node.js JSON对象和string的相互转化

JSON.parse(): 将一个字符串对象转化为json对象

ag:

const person = {
    name: "jack",
    age: 12,
    gender: "male"
}

console.log(JSON.stringify(person)) 
输出结果为: {"name":"jack","age":12,"gender":"male"}
JSON.stringify() 将一个json对象转化为字符串

ag:

const personString = `{
    "name":"jack",
    "age":12,
    "gender":"male"
}`
console.log(JSON.parse(personString)) 
输出结果为:{ name: 'jack', age: 12, gender: 'male' }
toString() 将buffer转换成字符串

ag:

const promise = new Promise((resolve, reject) => {
        const fullFilename = path.resolve(__dirname, "files", fileName)
        fs.readFile(fullFilename, (err, data) => {
            if(err) {
                reject(err)
                return
            }
            resolve(
            	// 由于readFile读取到的内容为buffer,toString()将其转化为字符串
                JSON.parse(data.toString())
            )
        })
    })
const net = require('net'); const iconv = require('iconv-lite'); //const car = require('./car32960.js'); const TCP_PORT = 29102; const jsonrpc = "2.0"; const timeout = 30 * 1000; let clients = []; const log = console.log; console.log = function (...args) { log(new Date().toLocaleString() + " \x1b[32mINFO\x1b[37m", ...args); }; const errorLog = console.error; console.error = function (...args) { errorLog(new Date().toLocaleString() + " \x1b[31mERROR\x1b[37m", ...args); }; // 创建TCP服务器 const server = net.createServer((socket) => { socket.setTimeout(timeout); console.log('终端已连接:', { remoteAddress: socket.remoteAddress, remoteFamily: socket.remoteFamily, remotePort: socket.remotePort, localAddress: socket.localAddress, localPort: socket.localPort }); clients.push(socket); // 监听数据接收事件 socket.on('data', (data) => { socket.setTimeout(timeout); json = JSON.parse(iconv.decode(data, 'gbk')); if (json.eqCode && !socket.eqCode) { socket.eqCode = json.eqCode; } //console.log("终端【" + (socket.eqCode || '') + "】上报数据:", json); var responseData = parse(socket, json); // var message = json.car; // if (message) { // car.parse32960(socket, message); // } if (responseData) { socket.write(JSON.stringify(responseData)); } }); // 监听连接关闭事件 socket.on('end', () => { console.log('终端已断开:', { remoteAddress: socket.remoteAddress, remoteFamily: socket.remoteFamily, remotePort: socket.remotePort, localAddress: socket.localAddress, localPort: socket.localPort }); clients = clients.filter((client) => client !== socket); }); socket.on('timeout', () => { console.log('终端连接超时,关闭连接'); socket.end(); }); // 监听错误事件 socket.on('error', (err) => { console.error('Socket错误:', err); }); }); // 设置服务器监听端口 server.listen(TCP_PORT, () => { console.log(`终端上报TCP端口:${TCP_PORT}`); }); // 监听服务器错误事件 server.on('error', (err) => { console.error('终端监听服务错误:', err); }); function parse(socket, data) { var responseData; var id = data && data.id || 0; switch(id) { case 101:{ // 读取串口配置 if (data && data.result && data.result.status === "success") { console.log("终端【" + (socket.eqCode || '') + "】读取串口配置成功:", data); } else { console.error("终端【" + (socket.eqCode || '') + "】读取串口配置异常:", data); } break; } case 102:{ // 下发串口配置 if (data && data.result && data.result.status === "success") { console.log("终端【" + (socket.eqCode || '') + "】下发串口配置成功:", data); } else { console.error("终端【" + (socket.eqCode || '') + "】下发串口配置异常:", data); } break; } case 103:{ // 读取CAN配置 if (data && data.result && data.result.status === "success") { console.log("终端【" + (socket.eqCode || '') + "】读取CAN配置成功:", data); } else { console.error("终端【" + (socket.eqCode || '') + "】读取CAN配置异常:", data); } break; } case 104:{ // 下发CAN配置 if (data && data.result && data.result.status === "success") { console.log("终端【" + (socket.eqCode || '') + "】下发CAN配置成功:", data); } else { console.error("终端【" + (socket.eqCode || '') + "】下发CAN配置异常:", data); } break; } case 105:{ // 读取CAN滤波字组 if (data && data.result && data.result.status === "success") { console.log("终端【" + (socket.eqCode || '') + "】读取CAN滤波字组成功:", data); } else { console.error("终端【" + (socket.eqCode || '') + "】读取CAN滤波字组异常:", data); } break; } case 106:{ // 下发CAN滤波字组 if (data && data.result && data.result.status === "success") { console.log("终端【" + (socket.eqCode || '') + "】下发CAN滤波字组成功:", data); } else { console.error("终端【" + (socket.eqCode || '') + "】下发CAN滤波字组异常:", data); } break; } case 107:{ // 读取TCP配置 if (data && data.result && data.result.status === "success") { console.log("终端【" + (socket.eqCode || '') + "】读取TCP配置成功:", data); } else { console.error("终端【" + (socket.eqCode || '') + "】读取TCP配置异常:", data); } break; } case 108:{ // 下发TCP配置 if (data && data.result && data.result.status === "success") { console.log("终端【" + (socket.eqCode || '') + "】下发TCP配置成功:", data); } else { console.error("终端【" + (socket.eqCode || '') + "】下发TCP配置异常:", data); } break; } case 109:{ // 重启结果 if (data && data.result && data.result.status === "success") { console.log("终端【" + (socket.eqCode || '') + "】重启成功:", data); } else { console.error("终端【" + (socket.eqCode || '') + "】重启异常:", data); } break; } case 1010:{ // 校时结果 if (data && data.result && data.result.status === "success") { console.log("终端【" + (socket.eqCode || '') + "】校时成功:", data); } else { console.error("终端【" + (socket.eqCode || '') + "】校时异常:", data); } break; } case 112:{ // 固件升级响应 if (data && data.result && data.result.status === "success") { console.log("终端【" + (socket.eqCode || '') + "】固件升级响应成功:", data); } else { console.error("终端【" + (socket.eqCode || '') + "】固件升级响应异常:", data); } break; } default: { var method = data && data.method || ''; switch(method) { case "register":{ // 上报注册 console.log("终端【" + (socket.eqCode || '') + "】注册:", data); upgrade(socket.eqCode,"ab1","1.0.0"); break; } case "heartbeat":{ // 上报心跳 console.log("终端【" + (socket.eqCode || '') + "】心跳:", data); break; } case "RequestFileData":{ // 固件下载请求 console.log("终端【" + (socket.eqCode || '') + "】固件下载:", data); responseData = {}; responseData.jsonrpc = jsonrpc; responseData.id = id; responseData.eqCode = data.eqCode || socket.eqCode; responseData.result = {}; responseData.result.status = "success"; const fileBuffer = fs.readFileSync("upgrade/" + data.params.name); const offset = data.params.offset; const size = data.params.size; responseData.result.offset = offset; responseData.result.size = size; responseData.result.data = Buffer.from(fileBuffer.slice(offset,offset + size)).toString('base64'); responseData.result.crc32 = zlib.crc32(responseData.result.data); console.log("终端【" + (socket.eqCode || '') + "】固件下载数据:", responseData); break; } case "ReportUpdateResult":{ // 上报更新结果 console.log("终端【" + (socket.eqCode || '') + "】固件更新结果:", data); if (data && data.params && data.params.ret === "success") { solidify(data.eqCode || socket.eqCode,1); } responseData = {}; responseData.jsonrpc = jsonrpc; responseData.id = id; responseData.eqCode = data.eqCode || socket.eqCode; responseData.result = {}; responseData.result.status = "success"; break; } default: { //console.log("终端数据未解析【" + id + "】:", data); if (data && data.error) { console.error("终端【" + (socket.eqCode || '') + "】上报数据:", data); } else { console.log("终端【" + (socket.eqCode || '') + "】上报数据:", data); } break; } } } } return responseData; }; function solidify(eqCode,action) { json = {}; var isSend = false; clients.forEach((client) => { if (client.eqCode === eqCode) { json.jsonrpc = jsonrpc; json.method = "StartSolidify"; json.eqCode = eqCode; json.id = 116; json.params = {}; json.params.action = action; client.write(JSON.stringify(json)); console.log("平台下发【" + eqCode + "】固化固件:", json); isSend = true; } }); if (isSend === true) { json.errorCode = 0; json.result = "Success"; json.message = "设备固化已下发"; } else { json.errorCode = 1; json.result = "Error"; json.message = "未找到设备" + eqCode; console.error("平台下发【" + eqCode + "】固化固件失败,未找到设备:", json); } return json; } function upgrade(eqCode,name,version) { json = {}; var isSend = false; clients.forEach((client) => { if (client.eqCode === eqCode) { json.jsonrpc = jsonrpc; json.method = "StartUpdate"; json.eqCode = eqCode; json.id = 112; json.params = {}; json.params.version = version; const filePath = "upgrade/" + name; const stats = fs.statSync(filePath); json.params.name = name; json.params.size = stats.size; const fileBuffer = fs.readFileSync(filePath); const crc32 = zlib.crc32(fileBuffer); json.params.crc32 = crc32; client.write(JSON.stringify(json)); console.log("平台下发【" + eqCode + "】固件升级:", json); isSend = true; } }); if (isSend === true) { json.errorCode = 0; json.result = "Success"; json.message = "设备固件升级已下发"; } else { json.errorCode = 1; json.result = "Error"; json.message = "平台下发【" + eqCode + "】固件升级失败,未找到设备" + eqCode; } return json; } const express = require('express'); const fs = require('fs'); const path = require('path'); const zlib = require('zlib'); const SERVER_PORT = 29103; const app = express(); app.listen(SERVER_PORT, () => console.log(`平台下发HTTP端口:${SERVER_PORT}`)) app.get('/readUart', (req, res) => { var json = {}; var eqCode = req.query && req.query.eqCode || ''; if (!eqCode) { json.errorCode = 1; json.result = "Error"; json.message = "必须参数eqCode为空"; res.json(json); return; } var value = req.query && req.query.value || 'uart1'; var isSend = false; clients.forEach((client) => { if (client.eqCode === eqCode) { json.jsonrpc = jsonrpc; json.method = "getUartPara"; json.eqCode = eqCode; json.id = 101; json.params = {}; json.params.name = value; client.write(JSON.stringify(json)); console.log("平台下发【" + eqCode + "】读取串口配置:", json); isSend = true; } }); if (isSend === true) { json.errorCode = 0; json.result = "Success"; json.message = "读取串口配置已下发"; } else { json.errorCode = 1; json.result = "Error"; json.message = "未找到设备" + eqCode; console.error("平台下发【" + eqCode + "】读取串口配置失败,未找到设备:", json); } res.json(json); }); app.get('/setUart', (req, res) => { var json = {}; var eqCode = req.query && req.query.eqCode || ''; if (!eqCode) { json.errorCode = 1; json.result = "Error"; json.message = "必须参数eqCode为空"; res.json(json); return; } var config = req.query && req.query.config; if (!config) { json.errorCode = 1; json.result = "Error"; json.message = "必须参数config为空"; res.json(json); return; } var value = req.query && req.query.value || 'uart1'; if (config.indexOf("{") !== 0 || config.lastIndexOf("}") < 0) { json.errorCode = 1; json.result = "Error"; json.message = "参数config数据格式错误"; res.json(json); return; } var isSend = false; clients.forEach((client) => { if (client.eqCode === eqCode) { json.jsonrpc = jsonrpc; json.method = "setUartPara"; json.eqCode = eqCode; json.id = 102; json.params = {}; json.params.name = value; json.config = JSON.parse(config); client.write(JSON.stringify(json)); console.log("平台下发【" + eqCode + "】串口配置:", json); isSend = true; } }); if (isSend === true) { json.errorCode = 0; json.result = "Success"; json.message = "串口配置已下发"; } else { json.errorCode = 1; json.result = "Error"; json.message = "未找到设备" + eqCode; console.error("平台下发【" + eqCode + "】串口配置失败,未找到设备:", json); } res.json(json); }); app.get('/readCan', (req, res) => { var json = {}; var eqCode = req.query && req.query.eqCode || ''; if (!eqCode) { json.errorCode = 1; json.result = "Error"; json.message = "必须参数eqCode为空"; res.json(json); return; } var value = req.query && req.query.value || 'can1'; var isSend = false; clients.forEach((client) => { if (client.eqCode === eqCode) { json.jsonrpc = jsonrpc; json.method = "getCanPara"; json.eqCode = eqCode; json.id = 103; json.params = {}; json.params.name = value; client.write(JSON.stringify(json)); console.log("平台下发【" + eqCode + "】读取CAN配置:", json); isSend = true; } }); if (isSend === true) { json.errorCode = 0; json.result = "Success"; json.message = "读取CAN配置已下发"; } else { json.errorCode = 1; json.result = "Error"; json.message = "未找到设备" + eqCode; console.error("平台下发【" + eqCode + "】读取CAN配置失败,未找到设备:", json); } res.json(json); }); app.get('/setCan', (req, res) => { var json = {}; var eqCode = req.query && req.query.eqCode || ''; if (!eqCode) { json.errorCode = 1; json.result = "Error"; json.message = "必须参数eqCode为空"; res.json(json); return; } var config = req.query && req.query.config; if (!config) { json.errorCode = 1; json.result = "Error"; json.message = "必须参数config为空"; res.json(json); return; } var value = req.query && req.query.value || 'can1'; if (config.indexOf("{") !== 0 || config.lastIndexOf("}") < 0) { json.errorCode = 1; json.result = "Error"; json.message = "参数config数据格式错误"; res.json(json); return; } var isSend = false; clients.forEach((client) => { if (client.eqCode === eqCode) { json.jsonrpc = jsonrpc; json.method = "setCanPara"; json.eqCode = eqCode; json.id = 104; json.params = {}; json.params.name = value; json.config = JSON.parse(config); client.write(JSON.stringify(json)); console.log("平台下发【" + eqCode + "】CAN配置:", json); isSend = true; } }); if (isSend === true) { json.errorCode = 0; json.result = "Success"; json.message = "CAN配置已下发"; } else { json.errorCode = 1; json.result = "Error"; json.message = "未找到设备" + eqCode; console.error("平台下发【" + eqCode + "】CAN配置失败,未找到设备:", json); } res.json(json); }); app.get('/readCanLvBo', (req, res) => { var json = {}; var eqCode = req.query && req.query.eqCode || ''; if (!eqCode) { json.errorCode = 1; json.result = "Error"; json.message = "必须参数eqCode为空"; res.json(json); return; } var value = req.query && req.query.value || 'can1'; var isSend = false; clients.forEach((client) => { if (client.eqCode === eqCode) { json.jsonrpc = jsonrpc; json.method = "getCanLvBoPara"; json.eqCode = eqCode; json.id = 105; json.params = {}; json.params.name = value; client.write(JSON.stringify(json)); console.log("平台下发【" + eqCode + "】读取CAN滤波字组:", json); isSend = true; } }); if (isSend === true) { json.errorCode = 0; json.result = "Success"; json.message = "读取CAN滤波字组已下发"; } else { json.errorCode = 1; json.result = "Error"; json.message = "未找到设备" + eqCode; console.error("平台下发【" + eqCode + "】读取CAN滤波字组失败,未找到设备:", json); } res.json(json); }); app.get('/setCanLvBo', (req, res) => { var json = {}; var eqCode = req.query && req.query.eqCode || ''; if (!eqCode) { json.errorCode = 1; json.result = "Error"; json.message = "必须参数eqCode为空"; res.json(json); return; } var config = req.query && req.query.config; if (!config) { json.errorCode = 1; json.result = "Error"; json.message = "必须参数config为空"; res.json(json); return; } var value = req.query && req.query.value || 'can1'; if (config.indexOf("{") !== 0 || config.lastIndexOf("}") < 0) { json.errorCode = 1; json.result = "Error"; json.message = "参数config数据格式错误"; res.json(json); return; } var isSend = false; clients.forEach((client) => { if (client.eqCode === eqCode) { json.jsonrpc = jsonrpc; json.method = "setCanLvBoPara "; json.eqCode = eqCode; json.id = 106; json.params = {}; json.params.name = value; json.config = JSON.parse(config); client.write(JSON.stringify(json)); console.log("平台下发【" + eqCode + "】CAN滤波字组:", json); isSend = true; } }); if (isSend === true) { json.errorCode = 0; json.result = "Success"; json.message = "CAN滤波字组已下发"; } else { json.errorCode = 1; json.result = "Error"; json.message = "未找到设备" + eqCode; console.error("平台下发【" + eqCode + "】CAN滤波字组失败,未找到设备:", json); } res.json(json); }); app.get('/readTcp', (req, res) => { var json = {}; var eqCode = req.query && req.query.eqCode || ''; if (!eqCode) { json.errorCode = 1; json.result = "Error"; json.message = "必须参数eqCode为空"; res.json(json); return; } var value = req.query && req.query.value || 'tcp1'; var isSend = false; clients.forEach((client) => { if (client.eqCode === eqCode) { json.jsonrpc = jsonrpc; json.method = "getTcpPara"; json.eqCode = eqCode; json.id = 107; json.params = {}; json.params.name = value; client.write(JSON.stringify(json)); console.log("平台下发【" + eqCode + "】读取TCP配置:", json); isSend = true; } }); if (isSend === true) { json.errorCode = 0; json.result = "Success"; json.message = "读取TCP配置已下发"; } else { json.errorCode = 1; json.result = "Error"; json.message = "未找到设备" + eqCode; console.error("平台下发【" + eqCode + "】读取TCP配置失败,未找到设备:", json); } res.json(json); }); app.get('/setTcp', (req, res) => { var json = {}; var eqCode = req.query && req.query.eqCode || ''; if (!eqCode) { json.errorCode = 1; json.result = "Error"; json.message = "必须参数eqCode为空"; res.json(json); return; } var config = req.query && req.query.config; if (!config) { json.errorCode = 1; json.result = "Error"; json.message = "必须参数config为空"; res.json(json); return; } var value = req.query && req.query.value || 'tcp1'; if (config.indexOf("{") !== 0 || config.lastIndexOf("}") < 0) { json.errorCode = 1; json.result = "Error"; json.message = "参数config数据格式错误"; res.json(json); return; } var isSend = false; clients.forEach((client) => { if (client.eqCode === eqCode) { json.jsonrpc = jsonrpc; json.method = "setTcpPara"; json.eqCode = eqCode; json.id = 108; json.params = {}; json.params.name = value; json.config = JSON.parse(config); client.write(JSON.stringify(json)); console.log("平台下发【" + eqCode + "】TCP配置:", json); isSend = true; } }); if (isSend === true) { json.errorCode = 0; json.result = "Success"; json.message = "TCP配置已下发"; } else { json.errorCode = 1; json.result = "Error"; json.message = "未找到设备" + eqCode; console.error("平台下发【" + eqCode + "】TCP配置失败,未找到设备:", json); } res.json(json); }); app.get('/restart', (req, res) => { var json = {}; var eqCode = req.query && req.query.eqCode || ''; if (!eqCode) { json.errorCode = 1; json.result = "Error"; json.message = "必须参数eqCode为空"; res.json(json); return; } var isSend = false; clients.forEach((client) => { if (client.eqCode === eqCode) { json.jsonrpc = jsonrpc; json.method = "reboot"; json.eqCode = eqCode; json.id = 109; json.params = {}; json.params.key = Buffer.from("EQAUTHRST2507001").toString('base64'); client.write(JSON.stringify(json)); console.log("平台下发【" + eqCode + "】重启请求:", json); isSend = true; } }); if (isSend === true) { json.errorCode = 0; json.result = "Success"; json.message = "设备重启已下发"; } else { json.errorCode = 1; json.result = "Error"; json.message = "未找到设备" + eqCode; console.error("平台下发【" + eqCode + "】重启失败,未找到设备:", json); } res.json(json); }); app.get('/checkTime', (req, res) => { var json = {}; var eqCode = req.query && req.query.eqCode || ''; if (!eqCode) { json.errorCode = 1; json.result = "Error"; json.message = "必须参数eqCode为空"; res.json(json); return; } var isSend = false; clients.forEach((client) => { if (client.eqCode === eqCode) { json.jsonrpc = jsonrpc; json.method = "timeSyn"; json.eqCode = eqCode; json.id = 1010; json.params = {}; var now = new Date(); json.params.time = now.getFullYear() + "-" + ((now.getMonth() + 1) < 10 ? ("0" + (now.getMonth() + 1)) : (now.getMonth() + 1)) + "-" + (now.getDate() < 10 ? ("0" + now.getDate()) : now.getDate()) + " " + (now.getHours() < 10 ? ("0" + now.getHours()) : now.getHours()) + ":" + (now.getMinutes() < 10 ? ("0" + now.getMinutes()) : now.getMinutes()) + ":" + (now.getSeconds() < 10 ? ("0" + now.getSeconds()) : now.getSeconds()); client.write(JSON.stringify(json)); console.log("平台下发【" + eqCode + "】校时请求:", json); isSend = true; } }); if (isSend === true) { json.errorCode = 0; json.result = "Success"; json.message = "设备校时已下发"; } else { json.errorCode = 1; json.result = "Error"; json.message = "未找到设备" + eqCode; console.error("平台下发【" + eqCode + "】校时失败,未找到设备:", json); } res.json(json); }); app.get('/upgrade', (req, res) => { var json = {}; var eqCode = req.query && req.query.eqCode || ''; if (!eqCode) { json.errorCode = 1; json.result = "Error"; json.message = "必须参数eqCode为空"; res.json(json); return; } var name = req.query && req.query.name || ''; if (!name) { json.errorCode = 1; json.result = "Error"; json.message = "必须参数name为空"; res.json(json); return; } var version = req.query && req.query.version || "1.0.0"; json = upgrade(eqCode,name,version); res.json(json); }); app.get('/solidify', (req, res) => { var json = {}; var eqCode = req.query && req.query.eqCode || ''; if (!eqCode) { json.errorCode = 1; json.result = "Error"; json.message = "必须参数eqCode为空"; res.json(json); return; } var action = req.query && req.query.action || 1; json = solidify(eqCode,action) res.json(json); }); app.get('/disconnect', (req, res) => { var json = {}; var eqCode = req.query && req.query.eqCode || ''; if (!eqCode) { json.errorCode = 1; json.result = "Error"; json.message = "必须参数eqCode为空"; res.json(json); return; } var isSend = false; clients.forEach((client) => { if (client.eqCode === eqCode) { client.end(); console.log("平台下发【" + eqCode + "】断开连接:", json); isSend = true; } }); if (isSend === true) { json.errorCode = 0; json.result = "Success"; json.message = "设备断开连接已下发"; } else { json.errorCode = 1; json.result = "Error"; json.message = "未找到设备" + eqCode; } res.json(json); }); app.get('/log', (req, res) => { const logFilePath = path.join(__dirname, '../../root/.pm2/logs/shouhuan230-1-out.log'); // 修改为你的日志文件路径 fs.readFile(logFilePath, 'utf8', (err, data) => { if (err) { console.error(err); res.status(500).send('日志文件读取失败'); } else { res.send(data); // 发送日志内容到客户端 } }); }); function makeCRCTable() { let c; const crcTable = []; for (let n = 0; n < 256; n++) { c = n; for (let k = 0; k < 8; k++) { c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); } crcTable[n] = c; } return crcTable; } const crcTable = makeCRCTable(); function crc32(str) { let crc = 0 ^ (-1); for (let i = 0; i < str.length; i++) { const charCode = str.charCodeAt(i); crc = (crc >>> 8) ^ crcTable[(crc ^ charCode) & 0xFF]; } return (crc ^ (-1)) >>> 0; } 将app.get('/upgrade', (req, res) => { 在vue中调用。
08-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值