使用Java API TransmissionWithRecipientArray对象,如何设置键值数组(Sparkpost)之类的元素
我使用Java API TransmissionWithRecipientArray对象针对模板发送电子邮件。我在替换数据方面遇到了一些问题。我已经在模板编辑器中测试了这些数据,但我不知道如何使用TransmissionWithRecipientArray引入替换数据 以下是一个示例:使用Java API TransmissionWithRecipientArray对象,如何设置键值数组(Sparkpost)之类的元素,java,arrays,json,scala,sparkpost,Java,Arrays,Json,Scala,Sparkpost,我使用Java API TransmissionWithRecipientArray对象针对模板发送电子邮件。我在替换数据方面遇到了一些问题。我已经在模板编辑器中测试了这些数据,但我不知道如何使用TransmissionWithRecipientArray引入替换数据 以下是一个示例: (...), "offers": [ { "description": "dddddddddddddddddd.", "discount": "ddddddd",
(...), "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}}
根据,在模板中循环数组的方式是:
{{ if offers }}
<ul>
{{ each offer }}
<li>Offer title is <b>{{ loop_var.name }}</b></li>
{{ end }}
</ul>
{{ end }}
{{if offers}
{{每个报价}}
- 报价标题为{loop_var.name}
{{end}
{{end}
您需要使用变量
loop\u var
,如果在数组中传递对象,则loop\u var
将是对象的根。因此,如果您想打印折扣
字段,您需要编写循环变量折扣
关于如何执行这类操作,有很多示例
就你的具体情况而言,我认为你想要类似的东西
private void sendmail(String from,String[]recipients)引发SparkPostException{
TransmissionWithRecipientArray传输=新传输WithRecipientArray();
//填充收件人
List recipientArray=new ArrayList();
for(字符串收件人:收件人){
RecipientAttributes RecipientAttributes=新RecipientAttributes();
recipientAttribs.setAddress(新地址属性(收件人));
recipientArray.add(recipientAttribs);
}
传输.setRecipientArray(recipientArray);
//填充替换数据
Map substitutionData=newhashmap();
substitutionData.put(“yourContent”,“您也可以添加替换数据”);
传输.设置替换数据(替换数据);
//您可以使用Jackson、GSON或任何标准JSON解码库
//建立这个结构。
List offers=new ArrayList();
对于(int i=0;i<2;i++){
Map offer=newhashmap();
报价。卖出(“说明”、“说明价值”+i);
要约出售(“折扣”、“折扣”+i);
要约.出售(“图像”、“图像”+i);
要约.认沽期权(“图像播音员”、“图像播音员”+i);
要约.出售(“alt_title”、“alt_title”+i);
报价。卖出(“跟踪”、“跟踪”+i);
报价。报价(“名称”、“名称”+i);
报价。卖出(“id”、“id”+i);
要约.认沽期权(“播音员已付”、“播音员已付”+i);
要约.认沽期权(“播音员图像”、“播音员图像”+i);
报盘.看跌期权(“播音员替补头衔”、“播音员替补头衔”+i);
要约。添加(要约);
}
替换数据。出售(“要约”,要约);
//填充电子邮件正文
TemplateContentAttributes contentAttributes=新的TemplateContentAttributes();
setFrom(新地址属性(from));
contentAttributes.setSubject(“☰ 你的主题内容在这里。{{yourContent}});
setText(“您也可以对文本执行此操作。请参阅https://www.sparkpost.com/blog/advanced-email-templates/ 例如“);
contentAttributes.setHtml(
“您的数据:
\n”
+“\n”
+“\n”
+“说明\n”
+“折扣\n”
+“图像\n”
+“图像\u播音员\n”
+“alt\u标题\n”
+“跟踪\n”
+“名称\n”
+“id\n”
+“播音员\u已付费\n”
+“播音员\u图像\n”
+“播音员\u备选\u标题\n”
+“\n”
+“{{each offers}}\n”
+“\n”
+“{{offers.description}}}}\n”
+“{{offers.discount}}}}\n”
+“{{offers.image}}}}\n”
+“{{offers.image{unclarner}}}\n”
+“{{offers.alt_title}}}}\n”
+“{{offers.tracking}}}}\n”
+“{{offers.name}}}}\n”
+“{{offers.id}}}}\n”
+“{{{提供.播音员{}}}\n”
+“{{提供.播音员{u图像}}}\n”
+“{{提供.播音员{alt{title}}}}\n”
+“\n”
+“{end}}\n”
+“\n\n”);
传输.setContentAttributes(contentAttributes);
传输.setContentAttributes(contentAttributes);
//发送电子邮件
IRestConnection连接=新的RestConnection(this.client,getEndPoint());
响应=ResourceTransmissions.create(连接,0,传输);
logger.debug(“传输响应:+响应”);
结果是这样的:
谢谢你们的回答 我们在这里遇到的问题是从Scala映射类型到Gson的转换 使用从Scala Maps创建的Gson库HashMaps进行处理的结果是不同的。包括额外的字段并更改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谢谢你的回答@balexandre,但是我需要像数组一样加入数据,这样==>{{offers[1].description}}我需要知道我需要在“setSubstitutionData”中引入什么,以便将该数据作为数组重新加入模板中(如在
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)}
}