替换 JSON 中的回车符 (CR) 或换行符 (LF)

问题描述 投票:0回答:1

我遇到了 JSON 的问题,我承认我对此知之甚少:

我有 UTF-8 编码文本,其格式为换行符和/或回车符,我将其打包在 FME 工作台中,以将其发送到名为 Desk Alerts 的软件的 API。初始文本是从文本文件中读取的,看起来像:

The enhanced alarm included the following information and instructions:

 
********************************************************************************
 blah blah blah blah
 
 additional blah blah info blah
 
 third line of blah blah blah
******************************************************************************

现在,请注意,每一行的末尾都有换行符,通常这些消息实际上非常冗长,并且最终消息是由多个文件构建的,因此在某种程度上,保留各个行非常重要。

API 的架构相对简单 - 看起来像这样:

{
  "body": "@Value(Body)",
  "title": "@Value(Subject)",
  "templateId": 4,
  "skinId": 1,
  "isEveryone": true,
  "recipients": []
}

...其中

@Value()
是包含文本(如上述文本)的动态变量。

当我发送这些请求时,我收到以下错误:

{
  "status": "Error",
  "errorMessage": "Request model invalid",
  "data": {
    "validationErrors": [
      "[queryParam] : The queryParam field is required.",
      "[$.body] : '0x0A' is invalid within a JSON string. The string should be correctly escaped. 

...我已经在 Google 上取得了足够的成功,知道这意味着“我们不喜欢 ”。但到目前为止我遇到的所有建议都是使用

\\n
而不是
\n
来“正确转义”。

所以我使用正则表达式搜索

[\n]
并将其替换为
\\n
,JSON 现在喜欢它,但给我的消息看起来像这样:

The enhanced alarm included the following information and instructions:\n \n \n ********************************************************************************\n \n THE FIRE TROUBLE CIRCUIT AT CLINICAL CENTER B BLDG IS REPORTING A MALFUNCTION!\n \n ********************************************************************************\n 3\n \n \tTHIS INDICATES A MALFUNCTION OF THE FIRE SYSTEM\n \tMONDAY THRU FRIDAY, 8:00 TO 4:30 PM, PLEASE NOTIFY PHYSICAL PLANT\n \tMAINTENANCE DISPATCH AT 3-1760.\n \tALL OTHER TIMES, NOTIFY THE CAMPUS TELEPHONE OPERATOR.\n \n ******************************************************************************\n \n

正如您可能已经收到的消息一样,我在选项卡方面也遇到了同样的问题。

我这样做错了吗?任何建议将不胜感激。

json utf-8 newline
1个回答
0
投票

让我们看一下 RFC 8259 第 7 部分:字符串,它定义了 JSON 中的字符串:

字符串以引号开头和结尾。所有 Unicode 字符都可以放在引号内,除了必须转义的字符:引号、反斜线和控制字符(U+0000 到 U+001F)

  • 0x0A
    (换行 = LF)是控制字符
  • 0x09
    (水平制表符 = HT)是控制字符
  • 0x0D
    (回车 = CR)是控制字符

您的 JSON 无效,错误消息正确。你必须转义每个不允许的字符:

任何字符都可以被转义。如果该字符位于基本多语言平面(U+0000 到 U+FFFF)中,则它可以表示为一个六字符序列:反斜线,后跟小写字母 u,后跟四个十六进制数字,这些数字编码字符的代码点。
...
或者,还有一些流行字符的两个字符序列转义表示。

示例:

性格 名字 Unicode 代码点转义 另类流行逃脱
0x09
水平制表机(HT)
\u0009
\t
0x0A
换行(LF)
\u000A
\n
0x0D
回车符(CR)
\u000D
\r

不仅仅是换行符、回车符和水平制表符必须转义 - 您必须转义字符串中的每个控制字符(

0x00
0x1F
\
"
。对于最流行的字符,有许多其他编程语言(例如
\n
\t
)中已知的简短转义。但也可以通过 Unicode 代码点(如
\u000A
\u0009
)转义它们,这应该很容易自己编程。

在 JSON 中为人类可读性而换行也会使其无效 - 怀疑您必须有一个很长的字符串文字行。 JSON 解析器很可能不关心字符串的长度,但也有其限制(RFC 第 9 节):

实现可能会对字符串的长度和字符内容设置限制。

© www.soinside.com 2019 - 2024. All rights reserved.