【问题标题】:Serializing JSON tersely with a max line length使用最大行长度简洁地序列化 JSON
【发布时间】:2012-06-29 04:11:09
【问题描述】:

所以我正在生成一个可能很长的 JSON 字符串,用于 Sendgrid 的 SMTP API。因为它作为 SMTP 标头,所以它应该有一个最大行长度(推荐 72,但绝对不超过 1000)。末尾的文档中描述了一种简单的解决方案:

http://docs.sendgrid.com/documentation/api/smtp-api/developers-guide/

他们建议这样做:

$js =~ s/(.{1,72})(\s)/$1\n   /g;

但我不喜欢这样,因为它可能会在空格有意义的字符串中拆分。此外,当空间很少且相距很远时,性能似乎非常糟糕。

现在我正在使用 Ruby,我可以执行以下操作:

JSON.generate(@hash, options)

选项提供不同的格式选项,记录在http://flori.github.com/json/doc/classes/JSON.html#method-i-generate。但是这些都没有给我我想要的东西,即每隔一段时间带有换行符的简洁 JSON。

有什么想法吗?

【问题讨论】:

  • 为什么不扫描" 对的行并在其末尾添加新行?这需要编写一个非常深入的正则表达式来计算字符和行长,但会解决你的问题。
  • 我想过这个,但我不想仅仅为了这个目的而写一个 JSON 解析器。正则表达式是不够的,它必须是一个完整的解析器。我也不想仅仅为了这个小用例而包含另一个 JSON 库,但如果我已经包含了一个 SAX 样式解析器,我认为它会提供最好的控制来做我想做的事。
  • 什么在消耗 JSON?如果您控制该代码,也许首先对 JSON 进行 Base64 编码可以解决问题。然后,您可以根据需要拆分 Base64 编码的 JSON,通过 SMTP 发送,然后在另一端解码。
  • 你能确定包含有意义空格的字符串永远不会超过 1000 个字符吗?
  • 这是在这种情况下帮助我的解决方案:stackoverflow.com/questions/15992281/…

标签: ruby json smtp sendgrid email-headers


【解决方案1】:
options = {
  indent:'',
  space:"\n",
  space_before:"\n",
  object_nl:"\n",
  array_nl:"\n",
}

这会在不会影响 JSON 语义的每个位置添加一个换行符,并禁用任何缩进。

它不简洁且不友好,但换行符只是多出 1 个字符,所以有很多换行符不会真正影响性能。它还为您提供最短的行而不影响字符串的内容。您可能应该检查它们以确保它们都在长度限制之下。

【讨论】:

    猜你喜欢
    • 2017-04-04
    • 2011-11-17
    • 2013-05-27
    • 2021-09-07
    • 2012-06-11
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    相关资源
    最近更新 更多