首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将此JSON解析为Map[String,User]?

如何将此JSON解析为Map[String,User]?
EN

Stack Overflow用户
提问于 2014-08-26 09:09:31
回答 3查看 132关注 0票数 2

我想从以下JSON开始:

代码语言:javascript
运行
复制
[
  {
    "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],其中键是名称,用户是如下所示的对象:

代码语言:javascript
运行
复制
case class User(name: String, profileImage: String, id: String) 

我正在使用Play和Scala,但我正在努力弄清楚如何进行JSON解析。

EN

回答 3

Stack Overflow用户

发布于 2014-08-26 10:13:54

首先,您可以为您的类型定义Reads类型类的实例:

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

代码语言:javascript
运行
复制
Json.parse(jsonString).validate[List[User]]

这并不完全是您想要的,但您可以很容易地将列表转换为地图:

代码语言:javascript
运行
复制
Json.parse(jsonString).validate[List[User]].map(_.map(u => u.name -> u).toMap)

现在你有了一个JsResult[Map[String, User]]

票数 1
EN

Stack Overflow用户

发布于 2014-08-26 13:37:35

或者,你也可以使用argonaut,它提供了更友好的api。

代码语言:javascript
运行
复制
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,因为验证是单体的,所以您可以将它与其他验证绑定(平面映射)。

票数 0
EN

Stack Overflow用户

发布于 2014-08-31 22:57:14

您可以尝试这样做:

1使用以下格式定义您的Case类:

代码语言:javascript
运行
复制
case class User(name: String, profileImage: String, id: String) {
    implicit val jsonFormat: Format[User] = Json.format[User]
}    

2将您的json解析为ListUser

代码语言:javascript
运行
复制
val jsonStr: String = ...
val users = Json.parse(jsonStr).as[List[User]]

3将您的用户分组到MapString,ListUser

代码语言:javascript
运行
复制
val whatYourWant:Map[String, User] = users.groupBy(_.name)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25496566

复制
相关文章

相似问题

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