jackson实现java对象转支付宝/微信模板消息
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jackson实现java对象转支付宝/微信模板消息相关的知识,希望对你有一定的参考价值。
一、支付宝消息模板大致长这样
{ "to_user_id": "", "telephone": "xxxxx", "template": { "template_id": "xxxxxx", "context": { "head_color": "#85be53", "url": "www.baidu.com", "action_name": "查看详情", "keyword1": { "color": "#85be53", "value": "15700000000" }, "keyword2": { "color": "#85be53", "value": "2017年06月" }, "keyword3": { "color": "#85be53", "value": "99.99" }, "keyword4": { "color": "#85be53", "value": "66.66" }, "first": { "color": "#85be53", "value": "您好,本月账单已出" }, "remark": { "color": "#85be53", "value": "谢谢使用。" } } } }
二、java pojo
最外层:TemplateMessage .java
import com.fasterxml.jackson.annotation.JsonProperty; import java.util.ArrayList; import java.util.List; import java.util.Objects; /** * @author hujunzheng * @create 2018-07-11 20:47 **/ public class TemplateMessage { @JsonProperty("to_user_id") private String toUserId = ""; private String telephone = ""; private NestTemplate template = new NestTemplate(); public String getToUserId() { return toUserId; } public void setToUserId(String toUserId) { this.toUserId = toUserId; } public String getTelephone() { return telephone; } public void setTelephone(String telephone) { this.telephone = telephone; } public NestTemplate getTemplate() { return template; } public void setTemplate(NestTemplate template) { this.template = template; } public TemplateMessage withToUserId(String toUserId) { this.toUserId = toUserId; return this; } public TemplateMessage withTelephone(String telephone) { this.telephone = telephone; return this; } public TemplateMessage withTemplateId(String templateId) { this.template.setTemplateId(templateId); return this; } public TemplateMessage withContextHeadColor(String color) { this.template.getContext().setHeadColor(color); return this; } public TemplateMessage withContextUrl(String url) { this.template.getContext().setUrl(url); return this; } public TemplateMessage withContextActionName(String actionName) { this.getTemplate().getContext().setActionName(actionName); return this; } public TemplateMessage withContextFirst(TemplateMessageItem first) { this.getTemplate().getContext().setFirst(first); return this; } public TemplateMessage withContextRemark(TemplateMessageItem remark) { this.getTemplate().getContext().setRemark(remark); return this; } public TemplateMessage addContextKeyword(TemplateMessageItem keyword) { List<TemplateMessageItem> keywords = this.getTemplate().getContext().getKeywords(); if (Objects.isNull(keyword)) { keywords = new ArrayList<>(); this.getTemplate().getContext().setKeywords(keywords); } keywords.add(keyword); return this; } }
第一个嵌套层:NestTemplate.java
import com.fasterxml.jackson.annotation.JsonProperty; public class NestTemplate { @JsonProperty("template_id") private String templateId; private NestContext context = new NestContext(); public String getTemplateId() { return templateId; } public void setTemplateId(String templateId) { this.templateId = templateId; } public NestContext getContext() { return context; } public void setContext(NestContext context) { this.context = context; } }
第三个嵌套层:NestContext.java
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.List; public class NestContext { @JsonProperty("head_color") private String headColor = "#85be53"; private String url; @JsonProperty("action_name") private String actionName; private TemplateMessageItem first; private TemplateMessageItem remark; @JsonProperty("keyword1") @JsonInclude(JsonInclude.Include.NON_NULL) @JsonSerialize(using = TemplateMessageItemsSerializer.class) private List<TemplateMessageItem> keywords; public String getHeadColor() { return headColor; } public void setHeadColor(String headColor) { this.headColor = headColor; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getActionName() { return actionName; } public void setActionName(String actionName) { this.actionName = actionName; } public TemplateMessageItem getFirst() { return first; } public void setFirst(TemplateMessageItem first) { this.first = first; } public TemplateMessageItem getRemark() { return remark; } public void setRemark(TemplateMessageItem remark) { this.remark = remark; } public List<TemplateMessageItem> getKeywords() { return keywords; } public void setKeywords(List<TemplateMessageItem> keywords) { this.keywords = keywords; } public static void main(String[] args) throws JsonProcessingException { NestContext context = new NestContext(); context.setFirst(new TemplateMessageItem("first")); context.setRemark(new TemplateMessageItem("remark")); context.setUrl("www.baidu.com"); context.setActionName("查看详情"); // List<TemplateMessageItem> keywords = new ArrayList<>(); // keywords.add(new TemplateMessageItem("充值金额")); // keywords.add(new TemplateMessageItem("手机号")); // context.setKeywords(keywords); System.out.println(new ObjectMapper().writeValueAsString(context)); } }
main方法中有注释:
{
"url":"www.baidu.com",
"first":{
"value":"first",
"color":"#113d83"
},
"remark":{
"value":"remark",
"color":"#113d83"
},
"head_color":"#85be53",
"action_name":"查看详情"
}
main方法中无注释
{
"url":"www.baidu.com",
"first":{
"value":"first",
"color":"#113d83"
},
"remark":{
"value":"remark",
"color":"#113d83"
},
"head_color":"#85be53",
"action_name":"查看详情",
"keyword1":{
"value":"充值金额",
"color":"#113d83"
},
"keyword2":{
"value":"手机号",
"color":"#113d83"
}
}
三、自定义字段序列化
将一个List中的每个对象输出为多个并列json key=value的形式,当然要靠JsonSerializer啦!
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import org.springframework.util.CollectionUtils; import java.io.IOException; import java.util.List; /** * @author hujunzheng * @create 2018-07-11 21:30 **/ public class TemplateMessageItemsSerializer extends JsonSerializer<List<TemplateMessageItem>> { @Override public void serialize(List<TemplateMessageItem> items, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException { if (CollectionUtils.isEmpty(items)) { return; } gen.writeObject(items.get(0)); for (int i = 1; i < items.size(); ++i) { gen.writeFieldName("keyword" + (i + 1)); gen.writeObject(items.get(i)); } } }
以上是关于jackson实现java对象转支付宝/微信模板消息的主要内容,如果未能解决你的问题,请参考以下文章
java实现沙箱测试环境支付宝支付(demo)和整合微信支付和支付宝支付到springmvc+spring+mybatis环境全过程(支付宝和微信支付附源码)