如何解析非标准格式数组?求cordova-brother-label-printer插件数据转JSON方法
解决cordova-brother-label-printer返回非标准JSON格式的问题
嘿,这个问题我之前用Brother打印机插件时也踩过坑!返回的这种{nodeName=PrinterName123456, ...}格式其实是Java集合(比如HashMap)默认的toString()输出,并不是标准JSON,咱们可以通过字符串处理把它转成可解析的JSON格式。
下面是两种实用的处理方案:
方案一:正则表达式替换(最直接)
通过正则匹配键值对的结构,给键名和值加上双引号,并修正分隔符,把它转换成标准JSON字符串,再用JSON.parse()解析。
示例代码(JavaScript)
function parseBrotherPrinterData(rawString) { try { // 1. 给所有键名加上双引号,同时把=替换成: let formatted = rawString.replace(/(\w+)=/g, '"$1":'); // 2. 给所有值加上双引号(适配字符串类型的值,打印机信息基本都是字符串) formatted = formatted.replace(/:([^,}]+)/g, ':"$1"'); // 3. 清理多余空格(可选,避免格式问题) formatted = formatted.replace(/\s+/g, ''); // 4. 解析成JSON对象 return JSON.parse(formatted); } catch (err) { console.error("转换打印机数据失败:", err); return null; } } // 测试使用 const rawPrinterList = '[{nodeName=PrinterName123456, serNo=Serial12345, ipAddress=192.168.1.134, macAddress=MA:CA:DD:RE:SS}]'; const printerJSON = parseBrotherPrinterData(rawPrinterList); console.log(printerJSON);
方案二:更严谨的正则适配特殊场景
如果打印机名称或其他字段包含空格、特殊符号,上面的基础正则可能会出错,这时可以用更精准的匹配逻辑:
function parseBrotherPrinterDataStrict(rawString) { try { // 匹配键名(支持带下划线/连字符的键) let formatted = rawString.replace(/([a-zA-Z0-9_\-]+)=/g, '"$1":'); // 匹配值,直到遇到逗号或大括号结束(非贪婪匹配) formatted = formatted.replace(/:([^,}]*?)(?=,|})/g, (match, value) => { // 如果值本身包含引号,先转义 const escapedValue = value.replace(/"/g, '\\"'); return `:"${escapedValue}"`; }); // 清理空格 formatted = formatted.replace(/\s+/g, ''); return JSON.parse(formatted); } catch (err) { console.error("严格模式转换失败:", err); return null; } }
额外提示
如果插件本身有配置项可以返回标准JSON,建议先查看插件的参数说明,不过根据我的使用经验,这个插件默认返回的就是这种Java风格的字符串,所以上面的字符串处理方法是最可靠的。
内容的提问来源于stack exchange,提问作者Daniel Hutton
相关产品推荐
相关产品推荐

