首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Scala Argonaut解析JSON数组

用Scala Argonaut解析JSON数组
EN

Stack Overflow用户
提问于 2014-03-18 15:32:51
回答 3查看 2.8K关注 0票数 7

我正在使用Scala & Argonaut,试图解析以下JSON:

代码语言:javascript
复制
[
    {
        "name": "apple",
        "type": "fruit",
        "size": 3
    },
    {
        "name": "jam",
        "type": "condiment",
        "size": 5
    },
    {
        "name": "beef",
        "type": "meat",
        "size": 1
    }
]

并且很难找到如何迭代这些值并将其提取到List[MyType]中,其中MyType将具有名称、类型和大小属性。

我很快就会发布更具体的代码(我尝试了很多东西),但基本上我想了解游标是如何工作的,以及如何遍历数组等等。我尝试使用\\ (downArray)移动到数组的头部,然后使用:->-迭代数组,然后--\ (downField)不可用(至少IntelliJ不这么认为)。所以问题是我该如何:

  • 导航到数组
  • 遍历数组(知道什么时候做完)
  • 提取每个字段的字符串、整数等值- jdecode[String]as[String]
EN

回答 3

Stack Overflow用户

发布于 2014-03-27 00:53:46

最简单的方法是为MyType定义一个编解码器。然后编译器将很高兴地为List[MyType]等构造一个解码器。我将在这里使用一个普通类(而不是case类)来说明正在发生的事情:

代码语言:javascript
复制
class MyType(val name: String, val tpe: String, val size: Int)

import argonaut._, Argonaut._

implicit def MyTypeCodec: CodecJson[MyType] = codec3(
  (name: String, tpe: String, size: Int) => new MyType(name, tpe, size),
  (myType: MyType) => (myType.name, myType.tpe, myType.size)
)("name", "type", "size")

codec3接受两个参数列表。第一个参数有两个参数,可以告诉您如何从一个MyType创建一个Tuple3实例,反之亦然。第二个参数列表允许您指定字段的名称。

现在您只需编写如下内容(如果json是您的字符串):

代码语言:javascript
复制
Parse.decodeValidation[List[MyType]](json)

你就完蛋了。

票数 6
EN

Stack Overflow用户

发布于 2016-02-09 08:15:41

由于您不需要编码,并且只考虑解码,所以您可以按照Travis的建议进行,而是实现另一个隐式: MyTypeDecodeJson

代码语言:javascript
复制
implicit def MyTypeDecodeJson: DecodeJson[MyType] = DecodeJson(
    raw => for {
    name     <- raw.get[String]("name")
    type     <- raw.get[String]("type")
    size     <- raw.get[Int]("size")
  } yield MyType(name, type, size))

然后解析您的列表:

代码语言:javascript
复制
Parse.decodeValidation[List[MyType]](jsonString)
票数 0
EN

Stack Overflow用户

发布于 2020-09-02 20:04:34

假设MyType是一个案例类,下面的工作也是有效的:

代码语言:javascript
复制
case class MyType(name: String, type: String, size: Int)

object MyType {
    implicit val createCodecJson: CodecJson[MyType] = CodecJson.casecodec3(apply, unapply)(
        "name",
        "type",
        "size"
    )
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22483944

复制
相关文章

相似问题

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