我遇到了 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
正如您可能已经收到的消息一样,我在选项卡方面也遇到了同样的问题。
我这样做错了吗?任何建议将不胜感激。
让我们看一下 RFC 8259 第 7 部分:字符串,它定义了 JSON 中的字符串:
字符串以引号开头和结尾。所有 Unicode 字符都可以放在引号内,除了必须转义的字符:引号、反斜线和控制字符(U+0000 到 U+001F)。
0x0A
(换行 = LF)是控制字符0x09
(水平制表符 = HT)是控制字符0x0D
(回车 = CR)是控制字符您的 JSON 无效,错误消息正确。你必须转义每个不允许的字符:
任何字符都可以被转义。如果该字符位于基本多语言平面(U+0000 到 U+FFFF)中,则它可以表示为一个六字符序列:反斜线,后跟小写字母 u,后跟四个十六进制数字,这些数字编码字符的代码点。
...
或者,还有一些流行字符的两个字符序列转义表示。
示例:
性格 | 名字 | Unicode 代码点转义 | 另类流行逃脱 |
---|---|---|---|
|
水平制表机(HT) |
|
|
|
换行(LF) |
|
|
|
回车符(CR) |
|
|
不仅仅是换行符、回车符和水平制表符必须转义 - 您必须转义字符串中的每个控制字符(
0x00
到0x1F
)和\
和"
。对于最流行的字符,有许多其他编程语言(例如 \n
和 \t
)中已知的简短转义。但也可以通过 Unicode 代码点(如 \u000A
和 \u0009
)转义它们,这应该很容易自己编程。
在 JSON 中为人类可读性而换行也会使其无效 - 怀疑您必须有一个很长的字符串文字行。 JSON 解析器很可能不关心字符串的长度,但也有其限制(RFC 第 9 节):
实现可能会对字符串的长度和字符内容设置限制。