【问题标题】:AWS IoT-Core how to properly publish a actual new line in a JSON value, not \r\n or \nAWS IoT-Core 如何正确发布 JSON 值中的实际新行,而不是 \r\n 或 \n
【发布时间】:2021-02-05 00:14:21
【问题描述】:

我有一个 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. 我不知道如何 stringfy 并保留实际的新行

我已经尝试过这些解决方案,但都没有奏效:s1s2s3

你猜猜如何做到这一点?

【问题讨论】:

  • 这里的目标不明确。你读入文件,把它分开,然后莫名其妙地把它粘在一起,就像原来一样。你只是剥掉标题吗?您可以通过删除第一个 "\n" 来做到这一点,而不会造成所有分裂加入混乱。
  • @tadman 你有另一种方法来删除文件的第一行(标题)然后检索所有行吗?如果是,请在此处发布我将使用它 -> stackoverflow.com/questions/65798821/…
  • 对于给定的strstr.replace(/^.*?\n/, '')str.substr(str.indexOf("\n")+1, str.length)

标签: javascript newline aws-iot


【解决方案1】:

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

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

在接收端,JSON 反序列化器可以处理\n 编码的字符串。如果您的接收器需要换行符,它就坏了,需要修理。如果您无法修复它,那么您将致力于发送实际上不是 JSON 的损坏的、格式错误的 JSON 数据,并且您的代理完全有理由将其丢弃。

【讨论】:

    猜你喜欢
    • 2014-12-17
    • 2010-12-20
    • 2020-05-11
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 2022-09-28
    相关资源
    最近更新 更多