我想从以下JSON开始:
[
{
"name": "Cat",
"profile_image_url": "http://a0.twimg.com/profile_images/2284174872/7df3h38zabcvjylnyfe3_normal.png",
"location": "San Francisco, CA",
"id_str": "799346"
},
{
"name": "Dog",
"profile_image_url": "http://a0.twimg.com/profile_images/2284174758/v65oai7fxn47qv9nectx_normal.png",
"location": "San Francisco, CA",
"id_str": "783214"
}
]添加到Map[String, User],其中键是名称,用户是如下所示的对象:
case class User(name: String, profileImage: String, id: String) 我正在使用Play和Scala,但我正在努力弄清楚如何进行JSON解析。
发布于 2014-08-26 10:13:54
首先,您可以为您的类型定义Reads类型类的实例:
import play.api.libs.functional.syntax._
import play.api.libs.json._
implicit val userReads = (
(__ \ 'name).read[String] and
(__ \ 'profile_image_url).read[String] and
(__ \ 'id_str).read[String]
)(User.apply _)然后你就可以免费得到一个Reads[List[User]]实例来解码你的JSON:
Json.parse(jsonString).validate[List[User]]这并不完全是您想要的,但您可以很容易地将列表转换为地图:
Json.parse(jsonString).validate[List[User]].map(_.map(u => u.name -> u).toMap)现在你有了一个JsResult[Map[String, User]]。
发布于 2014-08-26 13:37:35
或者,你也可以使用argonaut,它提供了更友好的api。
val json: String = """[
{
"name": "Cat",
"profile_image_url": "http://a0.twimg.com/profile_images/2284174872/7df3h38zabcvjylnyfe3_normal.png",
"location": "San Francisco, CA",
"id_str": "799346"
},
{
"name": "Dog",
"profile_image_url": "http://a0.twimg.com/profile_images/2284174758/v65oai7fxn47qv9nectx_normal.png",
"location": "San Francisco, CA",
"id_str": "783214"
}
]"""
import argonaut._, Argonaut._
case class User(name: String, url: String, location: String, idStr: String)
implicit def UserCodecJson =
casecodec4(User.apply, User.unapply)("name", "profile_image_url", "location", "id_str")
val result = json.decodeValidation[List[User]]
println(result) //Success(List(User(Cat,http://a0.twimg.com/profile ....这个结果的好处是Scalaz Validation,因为验证是单体的,所以您可以将它与其他验证绑定(平面映射)。
发布于 2014-08-31 22:57:14
您可以尝试这样做:
1使用以下格式定义您的Case类:
case class User(name: String, profileImage: String, id: String) {
implicit val jsonFormat: Format[User] = Json.format[User]
} 2将您的json解析为ListUser
val jsonStr: String = ...
val users = Json.parse(jsonStr).as[List[User]]3将您的用户分组到MapString,ListUser
val whatYourWant:Map[String, User] = users.groupBy(_.name)https://stackoverflow.com/questions/25496566
复制相似问题