AWS IoT-Core 如何在 JSON 值中正确发布实际的新行,而不是 \r\n 或 \n

AWS IoT-Core how to properly publish a actual new line in a JSON value, not \r\n or \n

我有一个 lambda (nodeJs),它读取 S3 存储桶中的文件 (.ref) 并将其内容发布到 AWS IoT-Core 代理中的主题中。 该文件包含如下内容(50 行):

model:type
aa;tp1
bb;tpz
cc;tpf
dd;tp1

代码必须删除第一行并检索剩余的 50 行。这是代码

async function gerRef (BUCKET_NAME) {
    const refFile = version + '/file.ref'
    const ref = await getObject(FIRMWARE_BUCKET_NAME, refFile)
    //Get the file content
    const refString = ref.toString('utf8')
    //Slip by each line
    let arrRef = refString.split('\n')
    //Remove the file header
    arrRef.shift()
    //join the lines
    let refString = arrRef.join('\n')

    return refString
}

然后我得到这个结果并像这样在 AWS IoT-Core Broker 中发布:

const publishMqtt = (params) =>
  new Promise((resolve, reject) =>
  iotdata.publish(params, (err, res) => resolve(res)))
...
let refData = await gerRef (bucket1)
let JsonPayload = {
    "attr1":"val1",
    "machineConfig":`${refData}` //Maybe here is the issue
}
let params = {
            topic: 'test/1',
            payload: JSON.stringify(JsonPayload) //Maybe here is the issue
            qos: '0'
        };

await publishMqtt(params)
...

然后在代理中发布。 问题是发布的内容没有真正的 new line。当我在经纪人中看到时,我得到以下 JSON:

{
     "attr1":"val1",
     "machineConfig":"aa;tp1\nbb;tpz\ncc;tpf\ndd;tp1"
}

接收此消息的机器正在等待真正的新行,如下所示:

{
     "attr1":"val1",
     "machineConfig":"aa;tp1
                      bb;tpz
                      cc;tpf
                      dd;tp1"
}

如果我只是将整个 JSON 复制并粘贴到 AWS IoT-Core 界面中,它会抱怨 JSON 解析但会作为字符串发布并且机器会接受数据 - 因为新线在那里:

简而言之,这里的重点是:

  1. 我们可以使用 JSON.stringify(JsonPayload) - 代理将接受
  2. 我不知道如何字符串化并保留实际的新行

我尝试了这些解决方案,但 none 成功了:s1, s2, s3

想知道如何实现吗?

机器所期待的是错误的。在 JSON 中,值 中的任何换行数据都必须 进行转义,而字符串中的 \n 是正确的方法。这就是收货人的期望失误了。

“真正的”换行符会导致无效的 JSON 文档,大多数解析器会断然拒绝它。

在接收端JSON解串器可以处理\n编码字符串。如果你的接收器需要换行,它就坏了,需要修理。如果您无法修复它,那么您将致力于发送损坏的、格式错误的 JSON-ish 数据,这些数据实际上不是 JSON,您的经纪人完全有理由将其丢弃。