我正在使用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]发布于 2014-03-27 00:53:46
最简单的方法是为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接受两个参数列表。第一个参数有两个参数,可以告诉您如何从一个MyType创建一个Tuple3实例,反之亦然。第二个参数列表允许您指定字段的名称。
现在您只需编写如下内容(如果json是您的字符串):
Parse.decodeValidation[List[MyType]](json)你就完蛋了。
发布于 2016-02-09 08:15:41
由于您不需要编码,并且只考虑解码,所以您可以按照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)发布于 2020-09-02 20:04:34
假设MyType是一个案例类,下面的工作也是有效的:
case class MyType(name: String, type: String, size: Int)
object MyType {
implicit val createCodecJson: CodecJson[MyType] = CodecJson.casecodec3(apply, unapply)(
"name",
"type",
"size"
)
}https://stackoverflow.com/questions/22483944
复制相似问题