簡體   English   中英

在案例類別中使用Lift-Json

[英]Using Lift-Json with Case Classes

我似乎無法為此特定的Json有效負載編寫適當的案例類。 我相信這與數組中的第一個索引有關,后者沒有鍵字符串。 關於如何解決這個問題的任何想法? 作為參考,我正在使用Scala 2.10.4,Akka 2.3.2,Spray 1.3.1和Lift-Json 2.6。 我嘗試提取的Json來自Mailgun的Events API 編輯:核心問題是如何提取到Json中沒有鍵的案例類? 我的代碼如下:

import net.liftweb.json._

case class Paging(next : String, previous : String)
case class DeliveryEnvelope(transport : String, sender : String, `sending-ip` : String)
case class DeliveryIndex(tags : List[String], envelope : DeliveryEnvelope)
case class DeliveryStatus(message : String, code : Int, description : String)
case class Flags(`is-authenticated` : Boolean, `is-test-mode` : Boolean)
case class DeliveryMessage(headers : Headers, attachments : Option[List[Object]], recipients : List[String], size : Long)
case class Headers(to : String, `message-id` : String, from : String, subject : String)
case class DeliveryData(index : DeliveryIndex, `delivery-status` : DeliveryStatus,
                    campaigns : List[String], `user-variables` : Object, flags : Flags, timestamp : Double,
                    message : DeliveryMessage, recipient : String, event : String)
case class Delivered(items: List[DeliveryData], paging: Paging)

object Main extends App {
  implicit val formats = DefaultFormats

val json = parse(
""" {
  "items": [
    {
      "tags": [],
      "envelope": {
        "transport": "smtp",
        "sender": "postmaster@samples.mailgun.org",
        "sending-ip": "184.173.153.199"
      },
      "delivery-status": {
        "message": "",
        "code": 0,
        "description": null
      },
      "campaigns": [],
      "user-variables": {},
      "flags": {
        "is-authenticated": true,
        "is-test-mode": false
      },
      "timestamp": 1377208314.173742,
      "message": {
        "headers": {
          "to": "recipient@example.com",
          "message-id": "20130822215151.29325.59996@samples.mailgun.org",
          "from": "sender@example.com",
          "subject": "Sample Message"
        },
        "attachments": [],
        "recipients": [
          "recipient@example.com"
        ],
        "size": 31143
      },
      "recipient": "recipient@example.com",
      "event": "delivered"
    }
  ],
  "paging": {
    "next": "https://api.mailgun.net/v2/samples.mailgun.org/events/W3siYiI6ICIy",
    "previous": "https://api.mailgun.net/v2/samples.mailgun.org/events/W3siYiI6"
  }
} """)
println(compactRender(json))
println(json.extract[Delivered])

並輸出:

{"items":[{"tags":[],"envelope":{"transport":"smtp","sender":"postmaster@samples.mailgun.org","sending-ip":"184.173.153.199"},"delivery-status":{"message":"","code":0,"description":null},"campaigns":[],"user-variables":{},"flags":{"is-authenticated":true,"is-test-mode":false},"timestamp":1.377208314173742E9,"message":{"headers":{"to":"recipient@example.com","message-id":"20130822215151.29325.59996@samples.mailgun.org","from":"sender@example.com","subject":"Sample Message"},"attachments":[],"recipients":["recipient@example.com"],"size":31143},"recipient":"recipient@example.com","event":"delivered"}],"paging":{"next":"https://api.mailgun.net/v2/samples.mailgun.org/events/W3siYiI6ICIy","previous":"https://api.mailgun.net/v2/samples.mailgun.org/events/W3siYiI6"}}
Exception in thread "main" net.liftweb.json.MappingException: No usable value for items
No usable value for index
No usable value for envelope
No usable value for transport
Did not find value which can be converted into java.lang.String
   at net.liftweb.json.Meta$.fail(Meta.scala:191)
   at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:357)
   at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:317)
   at net.liftweb.json.Extraction$$anonfun$14.apply(Extraction.scala:253)
   at net.liftweb.json.Extraction$$anonfun$14.apply(Extraction.scala:253)
   at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
   at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
   at scala.collection.immutable.List.foreach(List.scala:318)
   at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
   at scala.collection.AbstractTraversable.map(Traversable.scala:105)
   at net.liftweb.json.Extraction$.instantiate$1(Extraction.scala:253)
   at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:286)
   at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:315)
   at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$extract0(Extraction.scala:366)
   at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$extract0(Extraction.scala:199)
   at net.liftweb.json.Extraction$.extract(Extraction.scala:43)
   at net.liftweb.json.JsonAST$JValue.extract(JsonAST.scala:312)
   at Main$delayedInit$body.apply(Main.scala:87)
   at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
   at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
   at scala.App$$anonfun$main$1.apply(App.scala:71)
   at scala.App$$anonfun$main$1.apply(App.scala:71)
   at scala.collection.immutable.List.foreach(List.scala:318)
   at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:32)
   at scala.App$class.main(App.scala:71)
   at Main$.main(Main.scala:30)
   at Main.main(Main.scala)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke(Method.java:606)
   at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: net.liftweb.json.MappingException: No usable value for index
No usable value for envelope
No usable value for transport
Did not find value which can be converted into java.lang.String
   at net.liftweb.json.Meta$.fail(Meta.scala:191)
   at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:357)
   at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:317)
   at net.liftweb.json.Extraction$$anonfun$14.apply(Extraction.scala:253)
   at net.liftweb.json.Extraction$$anonfun$14.apply(Extraction.scala:253)
   at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
   at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
   at scala.collection.immutable.List.foreach(List.scala:318)
   at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
   at scala.collection.AbstractTraversable.map(Traversable.scala:105)
   at net.liftweb.json.Extraction$.instantiate$1(Extraction.scala:253)
   at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:286)
   at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:315)
   at net.liftweb.json.Extraction$$anonfun$21.apply(Extraction.scala:305)
   at net.liftweb.json.Extraction$$anonfun$21.apply(Extraction.scala:305)
   at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
   at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
   at scala.collection.immutable.List.foreach(List.scala:318)
   at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
   at scala.collection.AbstractTraversable.map(Traversable.scala:105)
   at net.liftweb.json.Extraction$.newCollection$1(Extraction.scala:305)
   at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:322)
   at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:351)
... 30 more
Caused by: net.liftweb.json.MappingException: No usable value for envelope
No usable value for transport
Did not find value which can be converted into java.lang.String
   at net.liftweb.json.Meta$.fail(Meta.scala:191)
   at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:357)
   at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:317)
   at net.liftweb.json.Extraction$$anonfun$14.apply(Extraction.scala:253)
   at net.liftweb.json.Extraction$$anonfun$14.apply(Extraction.scala:253)
   at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
   at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
   at scala.collection.immutable.List.foreach(List.scala:318)
   at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
   at scala.collection.AbstractTraversable.map(Traversable.scala:105)
   at net.liftweb.json.Extraction$.instantiate$1(Extraction.scala:253)
   at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:286)
   at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:315)
   at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:351)
... 51 more
Caused by: net.liftweb.json.MappingException: No usable value for transport
Did not find value which can be converted into java.lang.String
   at net.liftweb.json.Meta$.fail(Meta.scala:191)
   at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:357)
   at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:317)
   at net.liftweb.json.Extraction$$anonfun$14.apply(Extraction.scala:253)
   at net.liftweb.json.Extraction$$anonfun$14.apply(Extraction.scala:253)
   at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
   at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
   at scala.collection.immutable.List.foreach(List.scala:318)
   at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
   at scala.collection.AbstractTraversable.map(Traversable.scala:105)
   at net.liftweb.json.Extraction$.instantiate$1(Extraction.scala:253)
   at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:286)
   at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:315)
   at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:351)
... 63 more
Caused by: net.liftweb.json.MappingException: Did not find value which can be converted into java.lang.String
   at net.liftweb.json.Meta$.fail(Meta.scala:191)
   at net.liftweb.json.Extraction$.convert(Extraction.scala:403)
   at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:314)
   at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:351)
... 75 more

謝謝大家為我的問題提供(或只是查看)。 我已經通過遍歷Json的數據部分解決了我的問題。

val json = parse(STRING HERE)
      val elements = (json \\ "items").children
      for(item <- elements) {
        val data = item.extract[ClickData]

希望這可以幫助其他人解決這個問題或類似問題。

您正在將每個項目映射到DeliveryData的實例,但是在DeliveryData中:

  • 您有一個非可選索引字段,在相應的JSON中沒有任何值。 如果該值是可選的,則應將其定義為Option [DeliveryIndex]
  • 您沒有字段可映射JSON中包含的信封信息。 您已經創建了DeliveryEnvelope案例類,但僅由DeliveryIndex類引用,並且發布的JSON中不存在index字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM