【问题标题】:Split a long JSON string into lines in Ruby将一个长 JSON 字符串拆分为 Ruby 中的行
【发布时间】:2010-06-09 23:52:37
【问题描述】:

首先,背景:我正在编写一个使用 SendGrid 发送大量电子邮件的 Ruby 应用程序。 SendGrid 使用自定义电子邮件标头(JSON 格式)来设置收件人、要替换的值等。SendGrid 的文档建议拆分标头,使行短于 1,000 字节。

然后,我的问题是:给定一个长 JSON 字符串,我如何将其拆分为

这可能是不必要的,但这里有一个我想拆分的字符串示例:

X-SMTPAPI: {"sub": {"pet": ["dog", "cat"]}, "to": ["test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com", "test@gmail.com", "anothertest@gmail.com"]}

提前感谢您提供的任何帮助!

【问题讨论】:

    标签: ruby regex string split


    【解决方案1】:

    如果要拆分任意 JSON,则需要解析 JSON 才能知道可以拆分的位置。这是因为逗号和空格可以出现在名称/值内部以及标记之间。因此,我将首先解析字符串,然后通过使用 JSON.pretty_generate 之类的东西或通过编写我自己的生成方法来根据需要添加换行符来重新生成输出。

    如果您知道正在处理的 JSON 的特殊属性,则可能不必这样做。例如,如果您确定名称/值中没有出现空格并且名称/值具有一定的最大长度,则可以使用这样的正则表达式

        str = 'X-SMTPAPI: %s' % json.gsub(/(.{1,72})( +|$\n?)|(.{1,72})/,"\\1\\3\n")
    

    (我从这里获取了以上内容:http://wiki.sendgrid.com/doku.php?id=smtpapiheader.rb

    但是,这将强制拆分任何长度超过 144 个字符的标记(如果限制为 1,000,则不确定他们为什么选择数字 72),并且如果其中包含空格,则可能会在值的中间进行拆分。

    【讨论】:

      猜你喜欢
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      相关资源
      最近更新 更多