使用Scala Argonaut解析JSON数组

7

我正在使用Scala和Argonaut,尝试解析以下JSON:

[
    {
        "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]?

你尝试了什么?你能展示一下你的代码吗? - serejja
首先,您的JSON格式无效。这可能会导致错误?那你有什么计划呢?请访问http://jsonlint.com进行JSON验证。 - Themerius
3个回答

6

最简单的方法是为MyType定义一个编解码器。然后编译器将高兴地为List[MyType]等构造一个解码器。我这里使用了一个普通类(而不是case类),以便更清楚地说明发生了什么:

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需要使用两个参数列表。第一个有两个参数,可以告诉你如何从Tuple3创建MyType的实例,反之亦然。第二个参数列表可以让你指定字段的名称。
现在您只需要像下面这样写(如果json是您的字符串):
Parse.decodeValidation[List[MyType]](json)

完成了。


我建议使用casecodec而不是codecimplicit def MyTypeCodec = casecodec3(MyType.apply, MyType.unapply)("name", "type", "size") - Roman Zykov

0

既然您不需要进行编码,只需要解码,那么您可以按照Travis的建议进行操作,但是通过实现另一个隐式函数:MyTypeDecodeJson。

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))

然后解析您的列表:

Parse.decodeValidation[List[MyType]](jsonString)

0
假设MyType是一个case类,以下代码也可以正常工作:
case class MyType(name: String, type: String, size: Int)

object MyType {
    implicit val createCodecJson: CodecJson[MyType] = CodecJson.casecodec3(apply, unapply)(
        "name",
        "type",
        "size"
    )
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接