json - 折叠 JSON 字符串的正确语法是什么?
问题描述
我正在使用 Delphi 2009 来构建一个字符串变量,其中包含一个简单的 JON 字符串,该字符串来自我从数据库中获取的值。这会产生以下形式的字符串(尽管实际字符串可能更长)
{"alice@example.com": {"first":"Alice", "id": 2},"bob@example.com": {"first":"Bob", "id":1},"cath@example.com": {"first":"Cath", "id":3},"derek@example.com": {"first":"Derek", "id": 4}}
该字符串在电子邮件中作为名为 Recipient-Variables 的标头发送给公司。
我向公司发送电子邮件的说明说
注意“Recipient-Variables”标头的值应该是有效的 JSON 字符串,否则我们将无法解析它。如果您的“Recipient-Variables”标题超过 998 个字符,您应该使用折叠将变量分布在多行中。
我查看了这些 SO 帖子,试图理解折叠的含义,但无法真正理解回复,因为它们似乎经常引用特定的编辑器。
请有人可以使用我的示例向我展示我应该使用什么语法或我需要在我的字符串中插入哪些字符以符合指令并折叠我的 JSON 字符串,比如在 bob 和 cath 的记录之间?
(顺便说一句,我理解在编辑器中查看JSON 或其他代码时折叠的含义,但我不明白简单的 JSON 字符串需要如何格式化才能在特定位置进行折叠)
解决方案
我终于自己找到了答案,所以在这里发布以帮助其他人,以防万一。答案在这份关于 rfc2822 标准的文档中给出,该文档由网络工作组于 2001 年出版(P. Resnick,编辑)
https://www.rfc-editor.org/rfc/rfc2822#page-11
文件...
在“电子邮件”消息的框架内,指定计算机用户之间发送的文本消息的语法。
...并特别描述了电子邮件是如何构建的,特别是如何处理长标题。
第 2.2.3 节讨论了长标题字段,> 998 个字符,并说这些标题需要通过插入 CRLF 字符来折叠,然后紧跟一些空格,例如空格字符。
如果接收服务器遵循相同的标准,它将在解析标头之前去除 CRLF 字符,这本身将包括去除空格字符。
尽管结构化字段体的定义方式使得
折叠可以发生在许多词汇标记之间(甚至
在一些词汇标记内),但折叠应该仅限于
将 CRLF 放置在更高级别的句法中断处。例如,如果
字段主体被定义为逗号分隔值,则建议
折叠发生在逗号分隔结构化项目之后,优先于字段可以折叠的其他位置,即使在
其他地方允许折叠。
稍后,在第 3.2.3 节中,它解释了如何将注释与折叠空白结合起来。
所以似乎如果通过代码生成字符串,需要通过检测更高级别的语法边界来折叠长标题行,例如逗号,即从标题开始(或最后一个折叠点)少于 988 个字符) 并插入三个十六进制字符 x0D0A20。这可以在构建头文件后完成,也可以在生成头文件时立即完成。
作为后续,我现在注意到我正在使用的 Overbytes ICS 组件 (TSslSmtpCli) 具有布尔属性FoldHeaders
,因此这可能会为我完成所有工作。
推荐阅读
- c# - 使用 .NET Core 创建、显示和保存/导出绘图/图表
- asp.net-core - 有没有人可以为我提供解决此错误的方法?我不明白我在配置 IdentityServer4 时哪里错了
- c++ - 使用 const char* 键映射 c++ 检索 null
- kubernetes - 用于防止强制更新 AWS EKS 集群的 Terraform
- debugging - 如何解决 Google Apps 脚本开发中的常见错误
- php - 检查变量是否为图像/文件而不在 laravel 中使用请求对象
- python - Boto3 - 将文件从 S3 复制到 Lightsail
- vue.js - 将 Vuex 状态发送到后端
- c++ - openCL 支持向量作为内核参数吗?
- java - Quarkus 异步