首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala Argonaut折叠列表?

Scala Argonaut折叠列表?
EN

Stack Overflow用户
提问于 2021-06-25 02:47:58
回答 1查看 33关注 0票数 0

我是个新手(我被迫使用它,因为代码库比较旧,使用的是scalaz的旧版本,我们不打算更新它,因为我们从头开始重写这段过时的代码),我正在尝试找到一种方法将一些数据转储到JSON中。

我有一个名为Magnitude的case类。为简单起见,请将其定义为:

case class Magnitude(bandname: String)

我想要的是一个函数,它接受一个List[Magnitude]并输出Json,我可以将它与其他Json链接在一起。

现在,我正在做:

代码语言:javascript
复制
  def magnitudeFields(magnitudes: List[Magnitude]): Json =
    magnitudes.foldLeft(jEmptyObject) { case (j, m) =>
      ("bandName" := m.bandname) ->: j
    }

然后假设我有一个List[Magnitude]的实例化

代码语言:javascript
复制
val magList = List(Magnitude("R"), Magnitude("J"), Magnitude("_uc"), Magnitude("K"))

当我在调用中调用magnitudeFields(magList)时,例如:

代码语言:javascript
复制
... previousJsonData ->: ('magnitudes' := magnitudeFields(magList)) ->: nextJsonData ...

我只接收bandName: K,前面的三个条目不是该函数输出的JSON的一部分:

代码语言:javascript
复制
"magnitudes" : {
                    "bandName" : "K"
                  },

而不是我想要的,那是:

代码语言:javascript
复制
"magnitudes" : {
                    "bandName" : "R"
                    "bandName" : "J"
                    "bandName" : "_uc"
                    "bandName" : "K"
                  },

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-25 16:19:34

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

代码语言:javascript
复制
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"
    //}
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68121263

复制
相关文章

相似问题

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