从json字符串中提取邮件对象

时间:2014-02-18 17:42:05

标签: scala playframework lift-json

我从雅虎邮箱网络服务中获得了json的共鸣。之后我使用play json库进行解析。

现在我无法迭代它并构建具有发件人姓名,主题,ccList等的邮件对象列表。

我想构建的邮件对象是:List(EmailMessage(subject,recvdDate,body1,sender,recipientsList))

我查看了play website的文档。但很难将它们理解为scala中的学习者。有人可以帮助我如何使用案例类来实现这一目标。

我得到表格网络服务的响应:

{
    "result": {
        "folder": {
            "folderInfo": {
                "fid": "Sent",
                "name": "Sent"
            },
            "total": 3,
            "unread": 0,
            "size": 943522,
            "isSystem": true
        },
        "total": 3,
        "code": [],
        "message": [
            {
                "mid": "2_0_0_2_3196_ACfai2IAACqmUwNFtgAAAKAUN2U",
                "receivedDate": 1392723382,
                "subject": "test mail",
                "xapparentlyto": "",
                "hasBlockedImages": false,
                "flags": {
                    "isReplied": 0,
                    "isFlagged": 0,
                    "isRead": 1,
                    "isDraft": 0,
                    "isForwarded": 0,
                    "isHam": 0,
                    "isSpam": 0,
                    "hasAttachment": 0,
                    "isRecent": 1,
                    "inAddressBook": 0
                },
                "from": {
                    "email": "rajeevkumar.kallempudi@yahoo.com",
                    "name": "Rajeev Kumar Kallempudi"
                },
                "to": [
                    {
                        "email": "rajeevprasanna@gmail.com",
                        "name": "rajeevprasanna@gmail.com"
                    }
                ],
                "replyto": [
                    {
                        "email": "rajeevkumar.kallempudi@yahoo.com",
                        "name": "Rajeev Kumar Kallempudi"
                    }
                ],
                "cc": [],
                "bcc": [],
                "domainkey": false,
                "messageId": "<1392723382.76715.YahooMailNeo@web160105.mail.bf1.yahoo.com>",
                "inReplyTo": "",
                "references": "",
                "sender": "rajeevkumar.kallempudi@yahoo.com",
                "part": [
                    {
                        "partId": "HEADER",
                        "type": "x-unknown",
                        "subtype": "",
                        "typeParams": "",
                        "disposition": "",
                        "dispParams": "",
                        "encoding": "7bit",
                        "filename": "",
                        "size": 1474,
                        "contentId": "",
                        "isTruncated": false,
                        "hasBlockedImages": false,
                        "referencedInline": false
                    }                     
                ]
            },
            {
                "mid": "2_0_0_2_2463_ACfai2IAAAdpUwM1NwAAAD0sJOA",
                "receivedDate": 1392719159,
                "subject": "passage1",
                "xapparentlyto": "",
                "hasBlockedImages": false,
                "flags": {
                    "isReplied": 0,
                    "isFlagged": 0,
                    "isRead": 1,
                    "isDraft": 0,
                    "isForwarded": 0,
                    "isHam": 0,
                    "isSpam": 0,
                    "hasAttachment": 0,
                    "isRecent": 1,
                    "inAddressBook": 0
                },
                "from": {
                    "email": "rajeevkumar.kallempudi@yahoo.com",
                    "name": "Rajeev Kumar Kallempudi"
                },
                "to": [
                    {
                        "email": "rajeevkumar.kellmpudi@yahoo.com",
                        "name": ""
                    }
                ],
                "replyto": [
                    {
                        "email": "rajeevkumar.kallempudi@yahoo.com",
                        "name": "Rajeev Kumar Kallempudi"
                    }
                ],
                "cc": [],
                "bcc": [],
                "domainkey": false,
                "messageId": "<1392719159.63976.YahooMailNeo@web160106.mail.bf1.yahoo.com>",
                "inReplyTo": "",
                "references": "",
                "sender": "rajeevkumar.kallempudi@yahoo.com",
                "part": [
                    {
                        "partId": "HEADER",
                        "type": "x-unknown",
                        "subtype": "",
                        "typeParams": "",
                        "disposition": "",
                        "dispParams": "",
                        "encoding": "7bit",
                        "filename": "",
                        "size": 1949,
                        "contentId": "",
                        "isTruncated": false,
                        "hasBlockedImages": false,
                        "referencedInline": false
                    },
                    {
                        "partId": "TEXT",
                        "subtype": "alternative",
                        "type": "multipart",
                        "typeParams": "boundary=\"-827237569-990831377-1392719159=:63976\"",
                        "disposition": "",
                        "dispParams": "",
                        "encoding": "7bit",
                        "filename": "",
                        "size": 11623,
                        "contentId": "",
                        "isTruncated": false,
                        "hasBlockedImages": false,
                        "referencedInline": false
                    }                     
                ]
            } 
        ]
    },
    "error": null
}

1 个答案:

答案 0 :(得分:1)

如果您只是查询Yahoo的邮件,则无法获取电子邮件的内容,因此您应该使用看起来更像这样的查询。请注意,这将查询帐户的所有消息,包括已读或已存档的消息。

select
  message.subject,
  message.receivedDate,
  message.from,
  message.to,
  message.cc,
  message.bcc,
  message.part.text
from ymail.msgcontent
where (fid,mids) in (
  select
    folder.folderInfo.fid,
    mid
  from ymail.messages
)

完成后,您只需要使用Play文档中描述的JSON选择元素功能。看起来应该是这样的:

import java.util._

case class EmailMessage(
  subject      : String,
  receivedDate : Date,
  body         : String,
  sender       : String,
  recipients   : List[String]
)

def yahooToEmailMessage(json:JsValue) = {

  val subject = json / "result" / "message" / "subject"
  val body = json / "result" / "message" / "part" / "text"
  val ts = (json / "result" / "message" / "receivedDate").toLong

  val receivedDate = new Date(ts * 1000L)

  val sender = getRecipient(json / "result" / "message" / "to")
  val to  = getRecipients(json / "result" / "message" / "to")
  val cc  = getRecipients(json / "result" / "message" / "cc")
  val bcc = getRecipients(json / "result" / "message" / "bcc")

  val recipients = to ::: cc ::: bcc

  EmailMessage(
    subject,
    receivedDate,
    body,
    sender,
    recipients
  )
}

def getRecipient(recipient:JsValue):List[String] = {

  val name  = recipient / "name"
  val email = recipient / "email"

  name + " <" + email + ">"
}

def getRecipients(array:JsArray):List[String] = {
  array.foldLeft(List[String]()) {
    (list,recipient) => list ::: List(getRecipient(recipient))
  }
}