Java中如何向SendGrid动态模板传入复杂对象作为渲染参数
问题原因
你代码的问题在于两点:
addDynamicTemplateData方法本身就是将键值对写入SendGrid请求的dynamic_template_data节点,不需要你手动将dynamic_template_data作为键名传入- 你把TemplateObject序列化为JSON字符串传入,相当于给模板传入了一个字符串类型的参数,而不是结构化的对象/数组,模板的Mustache语法自然无法解析嵌套字段和循环逻辑。
正确实现代码
你可以直接将TemplateObject转换为JsonObject后遍历,批量添加所有动态参数:
Mail mail = new Mail(); Email fromEmail = new Email(); fromEmail.setName("shri"); fromEmail.setEmail("shrikant.sharma606@gmail.com"); mail.setFrom(fromEmail); mail.setTemplateId("d-xxxx"); Personalization personalization = new Personalization(); Gson gson = new Gson(); // 将TemplateObject转为结构化的JsonObject,不要转成字符串 JsonObject templateJson = gson.toJsonTree(templateObject).getAsJsonObject(); // 遍历所有属性,逐个添加到动态模板数据中 for (Map.Entry<String, JsonElement> entry : templateJson.entrySet()) { Object value = gson.fromJson(entry.getValue(), Object.class); personalization.addDynamicTemplateData(entry.getKey(), value); } personalization.addTo(new Email("abcd@gmail.com")); mail.addPersonalization(personalization);
这个写法可以完美兼容你定义的所有字段类型,包括布尔值、字符串、嵌套对象、列表,和你在SendGrid网页端测试的JSON结构完全一致,模板的Mustache语法可以正常解析所有变量、循环和判断逻辑。
内容的提问来源于stack exchange,提问作者shrikant.sharma
相关产品推荐
相关产品推荐

