首页 > 解决方案 > 合并列表中的多个 JObject - Json4s

问题描述

我正在尝试将多个 JObject 合并为一个 JObject。我有一个 JObject 列表,我试图对其进行迭代并将它们中的每一个合并到一个对象中,本质上是创建一个大型 json 对象。

下面的工作正常,但是在列表中它不起作用。我知道我做错了什么,但不确定是什么?

val obj1: JObject = RancherHelper.convertToJObject(containers.head)
val obj2: JObject = RancherHelper.convertToJObject(containers(1))
val obj3: JObject = RancherHelper.convertToJObject(containers(2))

val x: JObject = obj1 merge obj2 merge obj3

这不起作用:

def mergeJObjects(containers: List[JObject]): JObject = {
    val fullJsonObject: JObject = JObject()
    val singleObject = for{
      container <- containers
      fullObj = fullJsonObject.merge(container)
    } yield fullObj

    fullJsonObject
}

标签: javajsonscalalist

解决方案


与其映射列表,不如折叠它:

def mergeJObjects(containers: List[JObject]): JObject = {
  containers.foldLeft(JObject())((merged, next) => merged.merge(next))
}

你上面写的是语法糖:

val fullJsonObject = JObject()
val singleObject = containers.map { container =>
  val fullObj = fullJsonObject.merge(container)
  fullObj
}
fullJsonObject

本质上,您是在容器列表上进行映射,并且对于每个容器,您都将它与一个空的 JSON 对象 ( fullJsonObject) 合并。因此与 ;singleObject没有什么不同containers。它是您的原始 JSON 对象的列表。此外,由于fullJsonObject它是不可变的empty JObject,因此您只需在方法结束时返回空 JSON 对象。


推荐阅读