【问题标题】:Play 2.1 Reading JSON Objects in order玩 2.1 按顺序读取 JSON 对象
【发布时间】:2013-09-04 06:01:31
【问题描述】:

要解析的 JSON:http://www.dota2.com/jsfeed/heropickerdata?v=18874723138974056&l=english

Hero 类和 JSON 序列化

case class Hero(
    var id:Option[Int],
    name: String,
    bio: String,
        var trueName:Option[String]
){}
implicit val modelReader: Reads[Hero] = Json.reads[Hero]

读取数据

val future: Future[play.api.libs.ws.Response] = WS.url("http://www.dota2.com/jsfeed/heropickerdata?v=18874723138974056&l=english").get()
val json = Json.parse(Await.result(future,5 seconds).body).as[Map[String, Hero]]

var i = 1
json.foreach(p => { 
            p._2.trueName = Some(p._1)
    p._2.id = Some(i)
    p._2.commitToDatabase
    i += 1
})

我需要获取每个英雄的 id。 json 中英雄的顺序与他们的 id 匹配。显然,地图是无序的并且不会工作。有没有人有其他想法?

我尝试使用 LinkedHashMap。我什至尝试为 LinkedHashMap 进行隐式读取,但失败了。如果有人认为这是答案,那么您能给我一些指导吗?

它一直在说“找不到类型 scala.collection.mutable.LinkedHashMap[String,models.Hero] 的 Json 反序列化器。尝试为这种类型实现隐式读取或格式化。”。我将特征导入到我要读取的文件中。我有一种有趣的感觉,即我的 Reads 中的最后一行是问题所在。我想我不能只做 asInstanceOf,但是我对如何做这个读取没有其他想法。

LinkedHashMap 隐式读取代码:http://pastebin.com/cf5NpSCX

【问题讨论】:

  • 另一种选择可能是获取为Seq,然后在代码中将其更改为 LinkedHashMap
  • 问题是我还需要保留密钥。

标签: json scala playframework-2.0


【解决方案1】:

你可以尝试从Json.parse直接返回的JsObject中按顺序提取数据,可能是这样的:

val json = Json.parse(Await.result(future,5 seconds).body)
val heroes: Map[String, Hero] = json match {
  case obj: JsObject => 
    obj.fields.zipWithIndex.map{ case ((name: String, heroJson: JsValue), id) =>
      heroJson.asOpt[Hero].map{ _.copy(id = Some(id)) }
    }.flatten.toMap
  case _ = > Seq.empty
}

我认为您不再需要保留顺序的地图,因为 ID 已生成并已修复。

【讨论】:

  • 它说toMap有错误。 “- 无法证明models.Hero <: u>
  • 尝试从 Hero 中的 id 中移除可变限定符 (var),因为 Map 是不可变的。
  • 你能在某处发布完整的错误吗?你也可以试试编辑版本(我在模式匹配中添加了显式类型)。
  • 完整错误只是“-无法证明models.Hero <:>
  • 这是一个编译错误,可能是某个地方的宏代码产生的,我想知道它是从哪里来的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
相关资源
最近更新 更多