2010-06-09 62 views
1

首先,背景:我正在編寫一個使用SendGrid發送大量電子郵件的Ruby應用程序。 SendGrid使用自定義電子郵件標題(採用JSON格式)設置收件人,要替換的值等。SendGrid的文檔建議分割標題,以使行少於1,000字節。將一個長的JSON字符串拆分爲Ruby中的行

我的問題是這樣的:給定一個很長的JSON字符串,我怎樣才能將它分成幾行< 1,000,以便在適當的位置(即在逗號後面)而不是在一個字的中間?

這可能是不必要的,但在這裏我想分裂排序字符串的例子:

X-SMTPAPI: {"sub": {"pet": ["dog", "cat"]}, "to": ["[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]m", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]", "[email protected]"]} 

預先感謝任何幫助,您可以提供!

回答

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個字符的標記分裂(不確定爲什麼他們選擇數字72如果1,000是限制),並且如果它有空白的話可能會在值的中間分裂它。

相關問題