Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java API TransmissionWithRecipientArray对象,如何设置键值数组(Sparkpost)之类的元素_Java_Arrays_Json_Scala_Sparkpost - Fatal编程技术网

使用Java API TransmissionWithRecipientArray对象,如何设置键值数组(Sparkpost)之类的元素

使用Java API TransmissionWithRecipientArray对象,如何设置键值数组(Sparkpost)之类的元素,java,arrays,json,scala,sparkpost,Java,Arrays,Json,Scala,Sparkpost,我使用Java API TransmissionWithRecipientArray对象针对模板发送电子邮件。我在替换数据方面遇到了一些问题。我已经在模板编辑器中测试了这些数据,但我不知道如何使用TransmissionWithRecipientArray引入替换数据 以下是一个示例: (...), "offers": [ { "description": "dddddddddddddddddd.", "discount": "ddddddd",

我使用Java API TransmissionWithRecipientArray对象针对模板发送电子邮件。我在替换数据方面遇到了一些问题。我已经在模板编辑器中测试了这些数据,但我不知道如何使用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}}
根据,在模板中循环数组的方式是:

{{ 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)}
}