2012-06-27 16 views
3

因此,我在Sendgrid的SMTP API中使用了一個可能很長的JSON字符串。因爲它是作爲SMTP標題發送的,所以它應該具有最大行長度(建議72,但絕對不超過1000)。一個天真的解決方案是在文檔中,在結束描述:簡單地用最大行長度序列化JSON

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。

任何想法?

+0

爲什麼不掃描'''對的行並在這些行的末尾添加新行?這​​需要編寫一個非常深入的正則表達式來計算字符和行的長度,但是可以解決您的問題 – Swift

+0

I考慮到這一點,但我不想爲此寫一個JSON解析器,Regexp還不夠,它必須是一個完整的解析器。我也不想僅包含另一個JSON庫這是一個小用例,但是如果我已經包含了一個SAX樣式解析器,我認爲它可以爲我所需要的做出最好的控制 – gtd

+0

什麼在消耗JSON?如果你控制了這個代碼,那麼首先編碼JSON的Base64解決這個問題,然後你可以拆分Base64編碼的JSON,然後通過SMTP發送,然後在另一端對其進行解碼。 –

回答

1
options = { 
    indent:'', 
    space:"\n", 
    space_before:"\n", 
    object_nl:"\n", 
    array_nl:"\n", 
} 

這會在每一個不會影響JSON語義的地方放置一個換行符,並禁用任何縮進。

它不是簡潔而且不友善的人,但換行符只是一個額外的字符,所以它們中的很多不會以任何實際的方式影響性能。它還爲您提供儘可能短的行,而不會影響字符串的內容。你應該檢查一下,以確保它們都在最大限度內。