2010-06-09 3 views
1

En premier lieu, l'arrière-plan: J'écris une application Ruby qui utilise SendGrid pour envoyer des courriels de masse. SendGrid utilise un en-tête d'e-mail personnalisé (au format JSON) pour définir les destinataires, les valeurs à remplacer, etc. La documentation de SendGrid recommande de fractionner l'en-tête afin que les lignes soient plus courtes que 1 000 octets. Ma question, alors, est la suivante: étant donné une longue chaîne JSON, comment puis-je la diviser en lignes < 1000 de sorte que les lignes soient divisées aux endroits appropriés (après une virgule) plutôt qu'au milieu d'un mot ?Fractionner une longue chaîne JSON en lignes dans Ruby

Ceci est probablement inutile, mais voici un exemple du genre de chaîne que je voudrais partager:

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]com", "[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]"]} 

Merci d'avance pour toute aide que vous pouvez fournir!

Répondre

1

Si vous divisez du JSON arbitraire, vous devez analyser le JSON pour savoir où vous pouvez diviser. C'est parce que les virgules et les espaces peuvent apparaître à l'intérieur des noms/valeurs ainsi qu'entre les symboles. Donc, je voudrais d'abord analyser la chaîne, puis re-générer la sortie soit en utilisant quelque chose comme JSON.pretty_generate ou en écrivant ma propre méthode de génération qui ajoute des sauts de ligne si nécessaire.

Si vous connaissez des propriétés spéciales du JSON que vous traitez, vous n'aurez peut-être pas besoin de le faire. Par exemple, si vous êtes certain que pas d'espace apparaît dans le nom/valeurs et que le nom/valeurs ont une certaine longueur max, vous pouvez utiliser une expression régulière comme celui-ci

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

(je pris le dessus d'ici: Cependant, cela forcera une division de tout jeton de plus de 144 caractères (je ne sais pas pourquoi ils ont choisi le nombre 72 si 1 000 est la limite), et se divise éventuellement au milieu d'une valeur s'il y a des espaces dans il.

Questions connexes