首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Case类中使用Lift-Json

在Case类中使用Lift-Json
EN

Stack Overflow用户
提问于 2014-08-14 03:17:39
回答 2查看 1.9K关注 0票数 0

我似乎无法为这个特定的Json有效负载编写适当的案例类。我相信这与数组中的第一个索引有关,它没有键字符串。对如何补救有什么想法吗?作为参考,我正在使用Scala2.10.4、Akka 2.3.2、Spray 1.3.1和Lift-Json2.6。我试图提取的Json是从梅尔贡事件API中提取的。编辑:核心问题是如何提取到Json中没有键的案例类?我的代码如下:

代码语言:javascript
复制
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])

以及产出:

代码语言:javascript
复制
{"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
EN

回答 2

Stack Overflow用户

发布于 2014-08-16 08:41:41

谢谢大家对我的问题所作的贡献(或只是观看)。我通过循环遍历Json的数据部分解决了我的问题。

代码语言:javascript
复制
val json = parse(STRING HERE)
      val elements = (json \\ "items").children
      for(item <- elements) {
        val data = item.extract[ClickData]

希望这能帮助其他人解决这个或类似的问题。

票数 2
EN

Stack Overflow用户

发布于 2014-08-14 14:26:13

您正在将每个项映射到DeliveryData的一个实例,但在DeliveryData中:

  • 您有一个非可选的索引字段,在相应的JSON中没有值。如果该值是可选的,则应将其定义为OptionDeliveryIndex。
  • 您没有字段来映射JSON中包含的信封信息。您已经创建了一个DeliveryEnvelope案例类,但它仅由DeliveryIndex类引用,并且您发布的JSON中不存在索引字段。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25299474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档