Используя Java API TransmissionWithRecipientArray объект, как я могу установить элемент как массив значений ключа (Sparkpost) - PullRequest
1 голос
/ 15 марта 2019

Я отправляю электронные письма, используя объект API TransmissionWithRecipientArray Java против шаблона. У меня проблемы с данными замещения. Я протестировал эти данные в редакторе шаблонов, но я не знаю, как ввести эти данные замещения с помощью TransmissionWithRecipientArray.

Вот пример:

(...), "offers": [
     {
       "description": "dddddddddddddddddd.",
       "discount": "ddddddd",
       "image": "ddddddddddddddddddddd",
       "image_announcer": "dddddddddddddddddddddddddddd",
       "alt_title": "dddddddddddddddddddddd",
       "tracking": "dhsdjkhsdjksdh",
       "name": "sdhsdohdsiosd",
       "id": "8480515",
       "announcer_paid": "0",
       "announcer_image": "test",
       "announcer_alt_title": "wdiohdiowdhiowd"
     },
      {
       "description": "dddddddddddddddddd.",
       "discount": "ddddddd",
       "image": "ddddddddddddddddddddd",
       "image_announcer": "dddddddddddddddddddddddddddd",
       "alt_title": "dddddddddddddddddddddd",
       "tracking": "dhsdjkhsdjksdh",
       "name": "sdhsdohdsiosd",
       "id": "8480515",
       "announcer_paid": "0",
       "announcer_image": "test",
       "announcer_alt_title": "wdiohdiowdhiowd"
     }, (...)

Другими словами, вопрос заключается в следующем: что мы должны ввести в метод setSubstitutionData (), чтобы получить эти входные данные в качестве данных замещения? Мы проверили данные замещения с помощью редактора шаблонов.

transmission.setSubstitutionData(allSubstitutionData.asJava)

Обязательный HTML:

 {{offers[1].description}}

Ответы [ 3 ]

1 голос
/ 15 марта 2019

За документацию , способ циклического перебора массивов в шаблоне:

{{ if offers }}
<ul>
  {{ each offer }}
  <li>Offer title is <b>{{ loop_var.name }}</b></li>
  {{ end }}
</ul>
{{ end }}

вам нужно использовать переменную loop_var, и если вы передадите объект в массиве, то loop_var будет корнем вашего объекта. Поэтому, если вы хотите напечатать ваше поле discount, вам нужно написать loop_var.discount.

0 голосов
/ 19 марта 2019

Спасибо, ребята, за ваши ответы.

Проблема, с которой мы столкнулись, заключалась в преобразовании типа карты Scala в Gson.

Результат обработки с помощью библиотеки Gash HashMaps, созданной изКарты Scala отличаются.Включает в себя дополнительные поля и изменяет структуру JSON.

Решение - этот ответ для пользователей Java и для Scala: сначала выполните итерацию всех карт, преобразующихся в типы Java, например:

 def toJavaConverter(objectLevelSubs: immutable.Map[String, AnyRef]): java.util.LinkedHashMap[String, Object] = {
val output = new java.util.LinkedHashMap[java.lang.String, Object]
objectLevelSubs.foreach {      
  case (k: String, v: List[Predef.Map[String, AnyRef]]) => output.put(k, v.map(toJavaConverter))     
  case (k: String, v: Predef.Map[String, AnyRef]) => output.put(k, toJavaConverter(v))
  case (k: String, v: AnyRef) => output.put(k, v)
}
output}

И, наконец, преобразовать каждый элемент следующим образом.

 val gson: Gson = new GsonBuilder().setPrettyPrinting().enableComplexMapKeySerialization().create()
val finalSubstitutionData: util.LinkedHashMap[String, AnyRef] = new util.LinkedHashMap[String, AnyRef]()

javaObjectLevelSubs.forEach{
  case (k: String, v: String) => finalSubstitutionData.put(k, v)
  case (k: String, a) => a match {case l: List[_] => finalSubstitutionData.put(k, l.map(gson.toJsonTree).asJava)}
}

Спасибо @Yepher и @ balexandre

0 голосов
/ 15 марта 2019

Есть много примеров того, как это сделать здесь .

Для вашего конкретного случая, я думаю, вы хотите что-то вроде это .

      private void sendEmail(String from, String[] recipients) throws SparkPostException {
    TransmissionWithRecipientArray transmission = new TransmissionWithRecipientArray();

    // Populate Recipients
    List<RecipientAttributes> recipientArray = new ArrayList<RecipientAttributes>();
    for (String recipient : recipients) {
        RecipientAttributes recipientAttribs = new RecipientAttributes();
        recipientAttribs.setAddress(new AddressAttributes(recipient));
        recipientArray.add(recipientAttribs);
    }
    transmission.setRecipientArray(recipientArray);

    // Populate Substitution Data
    Map<String, Object> substitutionData = new HashMap<String, Object>();

    substitutionData.put("yourContent", "You can add substitution data too.");
    transmission.setSubstitutionData(substitutionData);

    // You can use Jackson, GSON or whatever you standard JSON decoding library is to
    // Build this structure.
    List<Map<String, String>> offers = new ArrayList<Map<String, String>>();
    for (int i = 0; i < 2; i++) {

        Map<String, String> offer = new HashMap<String, String>();
        offer.put("description", "description value " + i);
        offer.put("discount", "discount " + i);
        offer.put("image", "image " + i);
        offer.put("image_announcer", "image_announcer " + i);
        offer.put("alt_title", "alt_title " + i);
        offer.put("tracking", "tracking " + i);
        offer.put("name", "name " + i);
        offer.put("id", "id " + i);
        offer.put("announcer_paid", "announcer_paid " + i);
        offer.put("announcer_image", "announcer_image " + i);
        offer.put("announcer_alt_title", "announcer_alt_title " + i);

        offers.add(offer);
    }

    substitutionData.put("offers", offers);

    // Populate Email Body
    TemplateContentAttributes contentAttributes = new TemplateContentAttributes();
    contentAttributes.setFrom(new AddressAttributes(from));
    contentAttributes.setSubject("☰ Your subject content here. {{yourContent}}");
    contentAttributes.setText("You could do it for text too. See https://www.sparkpost.com/blog/advanced-email-templates/ for an example");
    contentAttributes.setHtml(
            "<b>Your Data:</b><br>\n"
                    + "<table border='1'>\n"
                    + "    <tr>\n"
                    + "        <th>description</th>\n"
                    + "        <th>discount</th>\n"
                    + "        <th>image</th>\n"
                    + "        <th>image_announcer</th>\n"
                    + "        <th>alt_title</th>\n"
                    + "        <th>tracking</th>\n"
                    + "        <th>name</th>\n"
                    + "        <th>id</th>\n"
                    + "        <th>announcer_paid</th>\n"
                    + "        <th>announcer_image</th>\n"
                    + "        <th>announcer_alt_title</th>\n"
                    + "    </tr>\n"
                    + "    {{each offers}}    \n"
                    + "        <tr>\n"
                    + "            <td> {{{offers.description}}} </td>\n"
                    + "            <td> {{{offers.discount}}} </td>\n"
                    + "            <td> {{{offers.image}}} </td>\n"
                    + "            <td> {{{offers.image_announcer}}} </td>\n"
                    + "            <td> {{{offers.alt_title}}} </td>\n"
                    + "            <td> {{{offers.tracking}}} </td>\n"
                    + "            <td> {{{offers.name}}} </td>\n"
                    + "            <td> {{{offers.id}}} </td>\n"
                    + "            <td> {{{offers.announcer_paid}}} </td>\n"
                    + "            <td> {{{offers.announcer_image}}} </td>\n"
                    + "            <td> {{{offers.announcer_alt_title}}} </td>\n"
                    + "        </tr>\n"
                    + "    {{ end }} \n"
                    + "</table>\n\n");
    transmission.setContentAttributes(contentAttributes);

    transmission.setContentAttributes(contentAttributes);

    // Send the Email
    IRestConnection connection = new RestConnection(this.client, getEndPoint());
    Response response = ResourceTransmissions.create(connection, 0, transmission);

    logger.debug("Transmission Response: " + response);

Вот как выглядит результат:

enter image description here

...