如何将自定义POJO转换为符合Microsoft Graph要求的JSON请求体?
问题描述
我需要向https://graph.microsoft.com/v1.0/me/sendMail接口发送POST请求发送邮件,已经写了带getter/setter的SendEmail POJO用来动态设置JSON参数,但测试类里生成的jsonRequest只序列化了ToRecipient对象,完全匹配不上接口要求的格式。请帮忙指导怎么用这个POJO构建出符合下面示例结构的完整JSON请求体。
SendEmail.java
import java.util.ArrayList; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.annotation.JsonProperty; public class SendEmail { public class Body{ public String contentType; public String content; public void setContentType(String contentType) { this.contentType = contentType; } public String getContentType() { return contentType; } public void setContent(String content) { this.content = content; } public String getContent() { return content; } } public class CcRecipient{ public EmailAddress emailAddress; public void setEmailAddress(SendEmail.EmailAddress emailAddress) { this.emailAddress = emailAddress; } public SendEmail.EmailAddress getEmailAddress() { return emailAddress; } } public class EmailAddress{ public String address; public void setAddress(String address) { this.address = address; } public String getAddress() { return address; } } public class Message{ public String subject; public Body body; public ArrayList<ToRecipient> toRecipients; public ArrayList<CcRecipient> ccRecipients; public void setSubject(String subject) { this.subject = subject; } public String getSubject() { return subject; } public void setBody(SendEmail.Body body) { this.body = body; } public SendEmail.Body getBody() { return body; } public void setToRecipients(ArrayList<SendEmail.ToRecipient> toRecipients) { this.toRecipients = toRecipients; } public ArrayList<SendEmail.ToRecipient> getToRecipients() { return toRecipients; } public void setCcRecipients(ArrayList<SendEmail.CcRecipient> ccRecipients) { this.ccRecipients = ccRecipients; } public ArrayList<SendEmail.CcRecipient> getCcRecipients() { return ccRecipients; } } public class Root{ public Message message; public String saveToSentItems; public void setMessage(SendEmail.Message message) { this.message = message; } public SendEmail.Message getMessage() { return message; } public void setSaveToSentItems(String saveToSentItems) { this.saveToSentItems = saveToSentItems; } public String getSaveToSentItems() { return saveToSentItems; } } public class ToRecipient{ public EmailAddress emailAddress; public void setEmailAddress(SendEmail.EmailAddress emailAddress) { this.emailAddress = emailAddress; } public SendEmail.EmailAddress getEmailAddress() { return emailAddress; } } }
Test.java(原代码)
SendEmail sendEmail = new SendEmail(); SendEmail.Message message = sendEmail.new Message(); message.setSubject("Test subject"); SendEmail.Body body = sendEmail.new Body(); body.setContent("this is a test body on an email"); SendEmail.ToRecipient toRecipient = sendEmail.new ToRecipient(); SendEmail.EmailAddress emailAddress = sendEmail.new EmailAddress(); emailAddress.setAddress("dummyemail@outlook.com"); toRecipient.setEmailAddress(emailAddress); String accessToken = connectEmail(); System.out.println("ACCESS TOKEN: "+accessToken); HttpURLConnection connection = null; Gson gson = new Gson(); String jsonRequest = gson.toJson(toRecipient); try { URL url = new URL("https://graph.microsoft.com/v1.0/me/sendMail"); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Authorization","Bearer "+accessToken); connection.setRequestProperty("Content-Type", "application/json"); //connection.setRequestProperty("Accept", "text/plain"); connection.setUseCaches(false); connection.setDoOutput(true); try(OutputStream os = connection.getOutputStream()) { System.out.println("jsonRequest: "+jsonRequest); os.write(jsonRequest.getBytes()); } } catch (Exception e) { System.out.println("EXCEPTION SENDING EMAIL"); }
目标请求格式示例
{ "message": { "subject": "Meet for lunch?", "body": { "contentType": "Text", "content": "The new cafeteria is open." }, "toRecipients": [ { "emailAddress": { "address": "frannis@contoso.onmicrosoft.com" } } ], "ccRecipients": [ { "emailAddress": { "address": "danas@contoso.onmicrosoft.com" } } ] }, "saveToSentItems": "false" }
解决方案
问题根源
你当前只序列化了单个ToRecipient对象,但接口要求的最外层是包含message和saveToSentItems的Root结构,必须把所有层级的对象完整组装后,再序列化最顶层的Root对象。
修正后的Test.java代码
SendEmail sendEmail = new SendEmail(); // 1. 构建收件人邮箱对象并放入集合(支持多个收件人) SendEmail.EmailAddress toEmail = sendEmail.new EmailAddress(); toEmail.setAddress("dummyemail@outlook.com"); SendEmail.ToRecipient toRecipient = sendEmail.new ToRecipient(); toRecipient.setEmailAddress(toEmail); ArrayList<SendEmail.ToRecipient> toRecipientsList = new ArrayList<>(); toRecipientsList.add(toRecipient); // 2. 构建邮件内容Body(补充缺失的contentType字段) SendEmail.Body body = sendEmail.new Body(); body.setContentType("Text"); body.setContent("this is a test body on an email"); // 3. 组装Message对象,关联主题、Body、收件人 SendEmail.Message message = sendEmail.new Message(); message.setSubject("Test subject"); message.setBody(body); message.setToRecipients(toRecipientsList); // 如需抄送人,可参照收件人逻辑构建ccRecipientsList后设置 // message.setCcRecipients(ccRecipientsList); // 4. 构建最顶层Root对象,匹配接口要求的外层结构 SendEmail.Root root = sendEmail.new Root(); root.setMessage(message); root.setSaveToSentItems("false"); String accessToken = connectEmail(); System.out.println("ACCESS TOKEN: "+accessToken); HttpURLConnection connection = null; Gson gson = new Gson(); // 序列化最顶层的Root对象,而非单个ToRecipient String jsonRequest = gson.toJson(root); try { URL url = new URL("https://graph.microsoft.com/v1.0/me/sendMail"); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Authorization","Bearer "+accessToken); connection.setRequestProperty("Content-Type", "application/json"); connection.setUseCaches(false); connection.setDoOutput(true); try(OutputStream os = connection.getOutputStream()) { System.out.println("jsonRequest: "+jsonRequest); os.write(jsonRequest.getBytes()); } } catch (Exception e) { e.printStackTrace(); // 建议打印异常栈,方便排查问题 System.out.println("EXCEPTION SENDING EMAIL"); }
关键修正点
- 层级完整组装:从底层
EmailAddress开始,依次组装ToRecipient→Body→Message→Root,确保每个层级对象正确关联。 - 集合处理:
toRecipients和ccRecipients是数组类型,必须用ArrayList包裹单个收件人对象,不能直接传单个对象。 - 序列化顶层对象:最终序列化的是
Root对象,它包含接口要求的所有顶级字段。 - 补充必填字段:原代码缺失
Body的contentType字段,这是目标格式中的必填项,必须补上。
内容的提问来源于stack exchange,提问作者Ti J
相关产品推荐
相关产品推荐

