将格式异常的字符串化JSON转为JSON对象并提取Body值
首先,你拿到的这段字符串是Java对象的toString()输出,并非标准JSON或JS对象格式,所以直接用eval转对象的方式根本行不通。咱们换个思路,用正则表达式直接定位并提取Body的值,这是最直接可靠的方案。
原始消息内容
(Body:'3886' MessageProperties [headers={}, timestamp=null, messageId=null, userId=null, receivedUserId=null, appId=null, clusterId=null, type=null, correlationId=null, correlationIdString=null, replyTo=null, contentType=application/x-java-serialized-object, contentEncoding=null, contentLength=0, deliveryMode=null, receivedDeliveryMode=PERSISTENT, expiration=null, priority=0, redelivered=false, receivedExchange=, receivedRoutingKey=bottomlesspit, receivedDelay=null, deliveryTag=62, messageCount=0, consumerTag=amq.ctag-sCwfLaMEqWp2GkFwFrY1yg, consumerQueue=bottomlesspit])
解决方案:正则提取
直接用正则匹配Body:'xxx'的固定结构,捕获单引号内的内容即可:
// 假设d.body就是你获取到的完整字符串 const messageContent = d.body; // 正则表达式:匹配Body:'后面的内容,直到遇到下一个单引号 const bodyRegex = /Body:'([^']+)'/; const matchResult = messageContent.match(bodyRegex); if (matchResult) { const bodyValue = matchResult[1]; console.log('Body的值:', bodyValue); // 输出:3886 } else { console.log('未找到Body字段'); }
为什么你的原有代码行不通?
你原来尝试的eval('{' + d.body + '}')会直接报错,因为这段字符串的格式完全不符合JS对象字面量规则:
- 整体开头是括号,不是对象的
{}结构 MessageProperties [headers={}]这种写法在JS里属于非法语法- 大量键值对没有用冒号、逗号等符合JS规范的符号分隔
所以转对象的思路不适用,直接用正则提取目标字段才是高效的正确路径。
内容的提问来源于stack exchange,提问作者Gandalf

