使用Scala Argonaut解析JSON数组

Gil*_*ert 7 json scala argonaut

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

[
    {
        "name": "apple",
        "type": "fruit",
        "size": 3
    },
    {
        "name": "jam",
        "type": "condiment",
        "size": 5
    },
    {
        "name": "beef",
        "type": "meat",
        "size": 1
    }
]
Run Code Online (Sandbox Code Playgroud)

而奋力工作,如何进行迭代,把值到一个List[MyType]地方MyType都会有名称,类型和大小等属性.

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

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

Tra*_*own 6

最简单的方法是为其定义编解码器MyType.然后,编译器将愉快地构建解码器List[MyType]等.我将在这里使用普通类(不是案例类)来明确发生了什么:

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")
Run Code Online (Sandbox Code Playgroud)

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

现在你可以写下面的内容(如果json是你的字符串):

Parse.decodeValidation[List[MyType]](json)
Run Code Online (Sandbox Code Playgroud)

而且你已经完成了.