0

我对 Argonaut 很陌生(我被迫使用它,因为代码库较旧,使用的是 scalaz 的旧版本,我们无意更新它,因为我们正在从头开始重写这个过时的代码),我'正在尝试找到一种将一些数据转储到 JSON 中的方法。

我有一个名为Magnitude. 为简单起见,将其定义为:

case class Magnitude(bandname: String)

我想要的是一个接收 aList[Magnitude]和输出的函数Json,我可以将它们与其他Json.

现在,我正在做:

  def magnitudeFields(magnitudes: List[Magnitude]): Json =
    magnitudes.foldLeft(jEmptyObject) { case (j, m) =>
      ("bandName" := m.bandname) ->: j
    }

然后说我有一个实例化List[Magnitude]

val magList = List(Magnitude("R"), Magnitude("J"), Magnitude("_uc"), Magnitude("K"))

当我打电话时magnitudeFields(magList)

... previousJsonData ->: ('magnitudes' := magnitudeFields(magList)) ->: nextJsonData ...

我只收到bandName: K和前面的其他三个条目不是函数输出的 JSON 的一部分:

"magnitudes" : {
                    "bandName" : "K"
                  },

而不是我想要的,即:

"magnitudes" : {
                    "bandName" : "R"
                    "bandName" : "J"
                    "bandName" : "_uc"
                    "bandName" : "K"
                  },

任何帮助将不胜感激。jEmptyObject我怀疑我在使用默认值时做错了什么,foldLeft并且可能需要jArray在某些时候使用类似的东西(函数返回List[Json],但我不确定我应该怎么做。

4

1 回答 1

1

您应该只定义一个EncodeJson实例Magnitude并让 Argonaut 处理其余的逻辑:

import argonaut._, Argonaut._

case class Magnitude(bandname: String)

object Magnitude {
  implicit val encode: EncodeJson[Magnitude] =
    EncodeJson { m =>
      jSingleObject("bandName", jString(m.bandname))
    }
}

object Main {
  val magList = List(Magnitude("R"), Magnitude("J"), Magnitude("_uc"), Magnitude("K"))

  def main(args: Array[String]): Unit = {
    val prefix = "prefix" := "prefix"
    val suffix = "suffix" := "suffix"
    val json = prefix ->: ("magnitudes" := magList) ->: suffix ->: jEmptyObject

    println(json.asJson.spaces2)
    //{
    //  "prefix" : "prefix",
    //  "magnitudes" : [
    //  {
    //    "bandName" : "R"
    //  },
    //  {
    //    "bandName" : "J"
    //  },
    //  {
    //    "bandName" : "_uc"
    //  },
    //  {
    //    "bandName" : "K"
    //  }
    //  ],
    //  "suffix" : "suffix"
    //}
  }
}
于 2021-06-25T08:19:33.633 回答